標籤:style blog http color 使用 io 資料 2014
首先,看一維數組。
[]符號是下標運算子,a[i]就是*(a+i)
那麼a[i][j] 就是*(a[i]+j)=*(*(a+i)+j)
本人對二級和多級指標的理解:1.抽象上說二級指標的內容是地址的地址。變數A好像跟你捉迷藏似的,你要想找到A,你先得去一個地方把A的地址給找出來,然後再根據這個地址找到A。就類似武俠電影裡的寶藏,你要先去一個人的背上發現藏寶圖,然後再根據藏寶圖裡畫的地址找到寶藏,在這裡,這個人的背就是一個最外層的地址,藏寶圖就是內層的地址。2.對於二級指標和多級指標,定義時,我們用多層衣服包裹上,先披上內層,再套上外層。而在使用二級指標和多級指標時,恰恰相反,我們要先脫去外層,再解開內層。
再看二級指標和二維數組及二維數組名之間的一些關係。
先運行下小程式。
#include<stdio.h>void main() { int a[2][3] = {{1,2,3},{4,5,6}}; printf("\n"); printf("a[0]的值:%x\n",a[0]); printf("a[0][0]的地址:%x\n",&a[0][0]); printf("a的值:%x\n",a); printf("\n"); printf("a[1]的值:%x\n",a[1]); printf("a[1][0]的地址:%x\n",&a[1][0]); printf("a+1的值:%x\n",a+1);}
運行結果:
結果分析:a+1是按照行移動的。
接下去我們定義二級指標。看下面小程式。
/**** @author:hushunfeng** */#include<stdio.h>void main() { int a[2][3] = {{1,2,3},{4,5,6}}; int **p = a; printf("p+1之前:%d\n",p); p++; printf("p+1之後:%d\n",p);}
結果:
顯然,二級指標的移動不是我們預想中的+12,而是+4,而這裡的+4和int型沒關係,換成char或者其他類型都是一樣。說明程式的寫法存在問題。
我們對程式進行改進:
/**** @author:hushunfeng** */#include<stdio.h>void main() { int a[2][3] = {{1,2,3},{4,5,6}}; //改進的地方 int **p = (int**)a; printf("p+1之前:%d\n",p); p++; printf("p+1之後:%d\n",p);
運行結果:還是不行!
為了證實之前說的內容,我們把int型換成char型嘗試。
/**** @author:hushunfeng** */#include<stdio.h>void main() { char a[2][3] = {{‘a‘,‘b‘,‘c‘},{‘d‘,‘e‘,‘f‘}}; //改進的地方 char **p = (char**)a; printf("p+1之前:%d\n",p); p++; printf("p+1之後:%d\n",p);}
運行結果:還是老樣子,結果並沒有改變。
下面分析下產生這種情況的原因:1.首先我們定義的二級指標,那麼應該有兩層地址。
2.char **p; 也可以寫成char*(*p),理解成*p的指標,也就是指標的指標。
3.而對指標的以為操作中,指標移位的幅度都是按照所指向的資料類型來確定的,這也就是為什麼結構體stuct中,指標的移位都是以一整個結構體為單位的,而並不按照結構體內部的資料類型來一個個移位,以為整個結構體類型就是一個資料類型。這一點很重要!!
4.按照(3)的原則,那麼char **p; p++;p所指向的類型還是一個指標類型,而指標類型就是一個地址,在32位系統下面就是佔4個位元組。所以p的值應該+4;這和p指標的指標指向的類型無關!!