指針數組
1、指針在本質上也是一個變量ide
2、指針須要佔用必定的內存空間函數
3、指針用於保存內存地址的值spa
4、能夠指向任何地方的內存空間很是的強大才能夠寫一個操做系統操作系統
5、指針
*號意義內存
1、在指針聲明時*號表示所聲明的變量爲指針編譯器
2、在指針使用時*號表示取指針所指向的內存空間中的值it
指針是變量所以能夠聲明指針參數編譯
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、指針的本質是變量保存的值被看作內存中的地址