指針
1、指針在本質上也是一個變量
2、指針需要佔用一定的內存空間
3、指針用於保存內存地址的值
4、可以指向任何地方的內存空間非常的強大纔可以寫一個操作系統
5、
*號意義
1、在指針聲明時*號表示所聲明的變量爲指針
2、在指針使用時*號表示取指針所指向的內存空間中的值
指針是變量因此可以聲明指針參數
1、當一個函數體內部需要改變實參的值則需要使用指針參數
2、函數調用時實參值將複製到形參
3、指針適用於複雜數據類型作爲參數的函數中
Const修飾的
constint*p;//p可變p指向的內容不可變
1、intconst*p;//p可變p指向的內容不可變
2、int*constp;//p不可變p指向的內容可變
3、constint*constp;//p和p指向的內容都不可變
4、constTypeNmmeElem和TypeNameconstp都是TypeName不可以改變
當const出現在*號左邊時指針指向的數據爲常量
當const出現在*後右邊時指針本身爲常量
總結
1、指針是C語言中一種特別的變量
2、指針所保存的值是內存的地址
3、可以通過指針修改內存中的任意地址內容
數組
1、數組在一片連續的內存空間中存儲元素
2、數組元素的個數可以顯示或隱式指定
顯示inta[5]={1,2,3}
隱式inttem[]={1,2,3}
1、數組名代表數組首元素的地址
2、數組的地址需要用取地址符&&才能得到
3、數組首元素的地址值與數組的地址值相同
4、數組首元素的地址與數組的地址是兩個不同的概念
1、數組名可以看做一個常量指針
2、數組名“指向”的是內存中數組首元素的起始位置
3、在表達式中數組名只能作爲右值使用
4、只有在下列場合中數組名不能看做常量指針
5、數組名作爲sizeof操作符的參數代表整個數組
6、數組名作爲&運算符的參數
7、數組是一片連續的內存空間
8、數組的地址和數組首元素的地址意義不同
9、數組名在大多數情況下被當成常量指針處理
10、數組名其實並不是指針在外部聲明時不能混淆
數組和指針的分析
1、數組是一段連續的內存空間
2、數組的空間大小爲sizeof(array_type)*array_size
3、數組名可看做指向數組第一個元素的常量指針
p+n=(unsignedintp)+n*sizeof(*p)
當前元素的下一個元素p-1將指向當前元素的上一
個元素。
4、指針之間只支持減法運算且必須參與運算的指針類型必
須相同
p1–p2;((unsignedint)p1-(unsignedint)p2)/sizeof(type);
注意
只有當兩個指針指向同一個數組中的元素時指針
相減纔有意義其意義爲指針所指元素的下標差結果未定義的.原因1、不同的棧之間相減有用麼2不同數組之間還存在內存對齊的
當兩個指針指向的元素不在同一個數組中時問題這樣子其結果也是無意義的
1、指針也可以進行關係運算
<<=>>=
2、指針關係運算的前提是同時指向同一個數組中的元素
3、任意兩個指針之間的比較運算(==,!=)無限制
4、以下標的形式訪問數組中的元素
5、以指針的形式訪問數組中的元素
6指針指向並未訪問不算越界的
從理論上而言當指針以固定增量在數組中移動時其效
率高於下標產生的代碼
當指針增量爲11且硬件具有硬件增量模型時表現更佳硬件加速基於指針的訪問
數組的訪問形式是unsignedintp+sizeoftype*n
指針訪問形式unsignedintp+4不斷地自加由於缺少了乘法效率變得更快。
文件內的數組參數要表示指針傳遞過程中會丟失數組大小
C語言中數組作爲函數參數時編譯器將
其編譯成對應的指針
voidf(inta[]);??voidf(int*a);
voidf(inta[5]);??voidf(int*a);
結論
一般情況下當定義的函數中有數組參數時需要定
義另一個參數來標示數組的大小。
數組聲明時編譯器自動分配一片連續內存空間
1、指針聲明時只分配了用於容納指針的44字節空間
2、在作爲函數參數時數組參數和指針參數等價
3、數組名在多數情況可以看做常量指針其值不能改變
4、指針的本質是變量保存的值被看做內存中的地址