一維陣列:
這裡我們定義一維陣列和一些其他變數予以區分。
char ar[10]={};
char (*p)[10]=&ar;
char *pt=ar;
//1printf("%d \n",sizeof(ar));
//2printf("%d
%d%d
%d \n",ar,*ar,ar+1,*ar+1);
//3printf("%d
%d%d
%d \n",&ar,*&ar,&ar+1,*&ar+1);
//4printf("%d
%d%d
%d\n",pt,*pt,pt+1,*pt+1);
//5printf("%d
%d%d
%d%d
%d\n",p,*p,**p,p+1,*p+1,**p+1);
我們定義乙個開闢四個整型空間的一維陣列ar。這裡我信printf函式沒有信監視器。
這裡我們來看1行,sizeof(ar)得出來的值都應該是16(4*sizeof(int))。這裡是陣列名的第乙個特殊處,對陣列名使用sizeof計算時,計算整個陣列的位元組大小。
再看2行,這裡所列印的四個值按順序為
1、陣列名的位址(char *型別)
2、對陣列首元素取值,所以是0(初始化都為0)(char型別)
3、 陣列下標為1的元素的位址(這裡的ar表明為陣列首元素的位址)(char *型別)
4、這裡*ar是char型別1這裡編譯器認為是int型,所以兩者相加為int型,用sizeof計算為4位元組(int型別),結果是1
再看3行:
1、&ar是取陣列名的位址,這個值還是陣列名的位址,值一樣(char[10]*)
2、先&ar取陣列的位址,在*後就是陣列名本身
3、&ar取陣列的位址+1,加(sizeof(char)*10)的位元組大小
4、*ar是取首元素型別char取&,是取首元素的位址,+1是走到了陣列下標為1的元素的位址。
這裡當對sizeof使用時有特殊表示。
再看4行
1、pt是乙個整型指標儲存陣列首元素的位址
2、*pt是陣列的第乙個元素的值
3、pt+1是在陣列下標為1的元素的位址
4、*pt+1是先取陣列的首元素,char型別+1結果是int型別,結果是1
再看5行
1、p是指向乙個開闢了10個int型別的陣列,這裡p指向陣列的首位址。
2、*p指向陣列的首元素的位址 (char星)
3、**p指向陣列的首元素char型別
4、 p+1指向下乙個陣列的首位址
5、*p+1,這裡是星p是陣列的首元素的位址+1表明是陣列下標為1的元素的位址
6、**p+1,這裡星星p是取首元素是char型別+1的結果是1(int型別)
二維陣列
int main()
; char (*p)[3][4]=&ar;
char (*br)[4]=ar;
//1printf("%d \n",sizeof(ar));
//2printf("%d
%d%d
%d%d
%d \n",ar,*ar,**ar,ar+1,*ar+1,**ar+1);
//3printf("%d
%d \n",&ar,&ar+1);
//4printf("%d
%d%d
%d%d
%d%d
%d \n",p,*p,**p,**
*p,p+1,*p+1,**p+1,**
*p+1);
//5printf("%d
%d%d
%d%d
%d \n",br,*br,**br,br+1,*br+1,**br+1);
return
0; return
0;}
這裡我們來看看這些顯示出來的值都是什麼:
我們來看1行所顯示
1、陣列名的乙個特殊處,用sizeof時是,計算整個陣列的位元組大小
結果是12(無符號整型)
再來看2行
1、ar在這裡是表示二維陣列首元素的位址(首元素是乙個一維陣列)
2、*ar表示指向二維陣列首元素一維陣列的首元素位址
3、**ar表示二維陣列首元素一維陣列的首元素,char型別
4、ar+1這裡加1是加了乙個元素的位元組大小,二維陣列的元素是一維陣列,這裡就加了4位元組。
5、*ar+1這裡加1是加了乙個char的大小
6、**ar+1這裡是char型別與int型別的運算結果是1(型別int)
再來看3行
1、這裡&ar表示的二維陣列的位址
2、加1是加乙個二維陣列的大小,也就是加12位元組
再看4行
1、這裡的p也是乙個陣列名的特殊,這裡p表示整個二維陣列的位址
2、*p這裡表示二維陣列的首元素的位址
3、**p這裡表示就是二維陣列的首元素一維陣列的首元素的位址
4、***p表示是char型別是二維陣列的首元素一維陣列的首元素
5、p+1這裡表示加整個陣列的大小
6、*p+1加的是二維陣列的元素一維陣列的大小
7、**p+1是加乙個一維陣列的元素大小乙個char型別
8、***p是乙個char型別加乙個int型別結果是1(int型別)
這裡看5行
1、這裡br代表二維陣列的首元素一維陣列的位址
2、這裡就表示一維陣列的首元素的位址
3、這裡就是char型別了
4、br+1這裡加1是加乙個一維陣列的大小
5、這裡加1是加乙個char的大小
6、這裡就是char型別資料加int型別資料結果是1(型別int)
陣列指標,指標陣列
char *(
*p)[3][4]=null;
printf("%d
%d%d
%d%d \n",sizeof(p),sizeof(*p),sizeof(**p),sizeof(**
*p),sizeof(**
**p));
我們再來看看,我們定義了乙個指標 該指標指向乙個三個元素的二維陣列,每個元素是4個元素的一維陣列,每乙個一維陣列的元素是char*。
這裡的顯示
1、這裡p的型別是(char*[3][4]*),指向乙個指標型別的二維陣列。
所以計算就是算指標,大小為4,若加1自然是加整個二維陣列的大小
2、*p這裡就是指向二維陣列的首元素位址,由於是使用sizeof特殊處理按照整個陣列大小來算結果是48,二維陣列的首元素位址就是一維陣列的位址,若加1其結果是加一維陣列的大小
3、**p這裡表示一維陣列的首元素位址,使用sizeof特殊處理計算一維陣列的大小,結果是16,若加1表示加乙個一維陣列的元素的大小。
4、**p這裡就是一維陣列的元素了,也就是char型別,sizeof計算就是計算指標,結果是4,加1也就是加乙個指標的大小
5、***p這裡就是一維陣列的元素char型別所指向的char型別,計算就是算char,結果是1,加1就是char與int的加和計算
陣列名與指標
引言 指標是c c 語言的特色,而陣列名與指標有太多的相似,甚至很多時候,陣列名可以作為指標使用。於是乎,很多程式設計者就被搞糊塗了。而許多的大學老師,他們在c語言的教學過程中也錯誤得給學生講解 陣列名就是指標 很幸運,我的大學老師就是其中之一。時至今日,我日復一日地進行著c c 專案的開發,而身邊...
陣列名與指標
include using namespace std int main int b 2 10 陣列名本身就是指標,再加上 就變成了雙指標,這裡的雙指標的就是指二維陣列 int p int a 1 p指向a陣列的第6個元素 雖然不存在 cout p 1 cout b 1 cout b 0 retur...
陣列名與指標
在本科畢業前,一直以為陣列名就是指標,但是最近看了一些技術文章和與一些技術大佬的討論,我開始迷茫了,在心裡一直有疑問,在本科寫程式的時候一直就拿陣列名當指標用啊,沒什麼問題啊,但是後來想了想,有了點靈感,就寫下來,不知道自己琢磨的是否通透,歡迎交流學習。首先說明陣列名為什麼不是指標 上例子 incl...