上回說到,指針,是變量的內存地址
其實二級指針,就是一級指針的內存地址
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。