二級指針與指針的運算

上回說到,指針,是變量的內存地址

其實二級指針,就是一級指針的內存地址

void main(){

? ?int i = 90;

? ?int *p = &i;

? ?int **p2 = &p;

? ?printf("%d",**p2);

? ?system("pause");

}

上面描述中,定義了一級指針p,二級指針p2

可以明顯看出,*p2,就是一級指針p的地址,**p2,就是90! 就是最終的值!很通順啊--

現在說說指針的運算

void main(){

? ? ? int num[] = {11,12,13,14,15};

? ? ? int *p = num;

? ? ? p++;

? ? ? printf("%d",*p);

? ? ? system("pause");

}

可以看出,num直接就是內存地址了,而不用寫&num,實際上,寫&num還會報錯,過不了編譯。這點跟JAVA是一樣的,對于數組為講,直接num,就是指的是內存地址!而且!是數組中的第一個元素的內存地址!!

固p++就好理解了,就是下一個元素的內存地址嘛,所以這里輸出的是,是12

對應的,也有p--,指上一個元素的內存地址

這個機制背后的原因,就是數組的內存地址,其實是線性增加的!p++,就是將內存地址的值,向右移了sizeof(int)個單位! 在這里就是向右偏移了4個字節。

因此可以看出,指針的加減,其實只有在數組里有意義,更確切的實際使用地點,是在數組遍歷的時候。

來個例子,這個例子是很原始,很低級語言的一種寫法

void main(){

? ?int num[5];

? ?int *p = num;

? ?int i = 0;

? ?for (; p < num + 5;p++){

? ? ? ? ?*p = i;

? ? ? ? ? i++;

? ? ? ? ?printf("%d\n", *p);

}

? ?system("pause");

}

在for中,p是指針!num是數組第一個元素的內存地址,num+5,就是最后一個數組中最后一個元素的內存地址。 可能會有疑問,int不是應該有4個字節嗎,這里怎么看出來,只+1就行了。 注意,這里是指針,+1,就表示向右移了4個字節!!! 固這里的輸出就是,0,1,2,3,4。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容