關於陣列名與指標的再學習

2021-08-10 14:46:17 字數 3631 閱讀 1748

一維陣列:

這裡我們定義一維陣列和一些其他變數予以區分。

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...