指標和陣列的練習

2021-09-26 12:04:12 字數 4859 閱讀 9387

首先做這些練習前我們要明白陣列名的意義:

1. sizeof(陣列名),這裡的陣列名表示整個陣列,計算的是整個陣列的大小,單位是位元組。

2. &陣列名,這裡的陣列名表示整個陣列,取出的是整個陣列的位址。

3. 除此之外所有的陣列名都表示首元素位址。而位址的大小都是4(32為平台)/8(64位平台)個位元組。

ps:本篇為32位平台下執行結果

一維陣列:

int a = ;

printf("%d\n",sizeof(a));  //16

屬於第1種情況,表示整個陣列的大小,為16個位元組

printf("%d\n",sizeof(a+0));  //4

表示首元素位址,大小為4個位元組

printf("%d\n",sizeof(*a));   //4

首元素位址解引用,表示首元素,大小為4個位元組

printf("%d\n",sizeof(a+1));  //4

表示首元素位址+1,即第二個元素位址,大小為4個位元組

printf("%d\n",sizeof(a[1]));  //4

表示第二個元素,大小為4個位元組

printf("%d\n",sizeof(&a));   //4

表示整個陣列的位址,大小為4個位元組

printf("%d\n",sizeof(*&a));   //16

對陣列的位址解引用,表示整個陣列的大小,為16個位元組

printf("%d\n",sizeof(&a+1));  //4

表示跳過整個陣列的下乙個陣列的位址,大小為4個位元組

printf("%d\n",sizeof(&a[0]));  //4

表示首元素位址,大小為4個位元組

printf("%d\n",sizeof(&a[0]+1));  //4

表示首元素位址+1,即第二個元素位址,大小為4個位元組

字元陣列

char arr = ;  (沒有 \0字元)

printf("%d\n", sizeof(arr));  //6

表示6個位元組,有6個元素

printf("%d\n", sizeof(arr+0));   //4

表示首元素位址,大小為4個位元組

printf("%d\n", sizeof(*arr)); //1

首元素位址解引用,表示首元素,大小為1個位元組

printf("%d\n", sizeof(arr[1])); //1

表示第二個元素,大小為1個位元組

printf("%d\n", sizeof(&arr)); //4

表示取陣列的位址,大小為4個位元組

printf("%d\n", sizeof(&arr+1)); //4

表示跳過乙個陣列下乙個陣列的位址,大小為4個位元組

printf("%d\n", sizeof(&arr[0]+1)); //4

表示第二個元素的位址,大小為4個位元組

printf("%d\n", strlen(arr)); //隨機值x

strlen求字串長度,傳的是位址,遇到\0的位置不確定,arr表示首元素位址

printf("%d\n", strlen(arr+0)); //隨機值x

遇到\0的位置不確定,arr表示首元素位址

printf("%d\n", strlen(*arr)); //錯誤

*arr是97作為位址傳進去,97作為位址以後的空間不允許訪問

printf("%d\n", strlen(arr[1])); //錯誤同上

printf("%d\n", strlen(&arr)); //隨機值x

遇到\0的位置不確定,arr表示首元素位址

printf("%d\n", strlen(&arr+1)); //隨機值y     x-y=6

跳過乙個陣列下乙個陣列的位址 

printf("%d\n", strlen(&arr[0]+1)); //隨機值 w    x-w=1

從第二個元素向後數, 遇到\0的位置不確定 

char arr = "abcdef"; (有\0字元)

printf("%d\n", sizeof(arr));    //7

表示陣列的大小,7個位元組

printf("%d\n", sizeof(arr+0));  //4

arr是首元素位址,大小為4個位元組

printf("%d\n", sizeof(*arr));  //1

表示首元素,大小為1個位元組

printf("%d\n", sizeof(arr[1]));  //1

表示第二個元素,大小為1個位元組

printf("%d\n", sizeof(&arr));  //4

表示陣列的位址,大小為4個位元組

printf("%d\n", sizeof(&arr+1));  //4

表示跳過乙個陣列到下乙個陣列的位址,大小為4個位元組

printf("%d\n", sizeof(&arr[0]+1));  //4

表示第二個元素的位址,大小為4個位元組

printf("%d\n", strlen(arr));  //6

表示字串長度,大小為6

printf("%d\n", strlen(arr+0));  //6

表示字串長度,大小為6個

printf("%d\n", strlen(*arr));  //錯誤

*arr是97作為位址傳進去,97作為位址以後的空間不允許訪問

printf("%d\n", strlen(arr[1]));  //錯誤同上

printf("%d\n", strlen(&arr));  //6

陣列的位址和首元素位址值一樣,從第乙個元素開始數,大小為6

printf("%d\n", strlen(&arr+1));  //隨機值

表示跳過乙個陣列下乙個陣列的位址,遇到\0的位置不確定

printf("%d\n", strlen(&arr[0]+1));  //5

從第二個元素開始數,大小為5

char *p = "abcdef";  //將常量字串的a放到指標變數p中

printf("%d\n", sizeof(p));  //4

指標變數的大小,為4個位元組

printf("%d\n", sizeof(p+1));  //4

b的位址的大小,為4個位元組

printf("%d\n", sizeof(*p));  //1

首元素a字元的大小,為1個位元組

printf("%d\n", sizeof(p[0]));  //4

p[0] == *(p+0) 大小為1個位元組

printf("%d\n", sizeof(&p));  //4

指標變數的位址,大小為4個位元組

printf("%d\n", sizeof(&p+1));  //4

還是位址,大小為4個位元組(跳過乙個char*(指標型別))

printf("%d\n", sizeof(&p[0]+1));  //4

第二個元素位址,大小為4

printf("%d\n", strlen(p));  //6

p存放a的位址,往後數大小為6

printf("%d\n", strlen(p+1));  //5

p+1存放b的位址,往後數大小為5

printf("%d\n", strlen(*p));  //錯誤

*p是97作為位址傳進去,97作為位址以後的空間不允許訪問

printf("%d\n", strlen(p[0]));  //錯誤

p[0]相當於*p

printf("%d\n", strlen(&p));  //隨機值

遇到\0的位置不確定

printf("%d\n", strlen(&p+1));  //隨機值

遇到\0的位置不確定

printf("%d\n", strlen(&p[0]+1));   //5

b的位址往後數,大小為5

二維陣列

int a[3][4] = ;  

printf("%d\n",sizeof(a));  \\48

表整個陣列的大小,為48個位元組

printf("%d\n",sizeof(a[0][0]));  \\4

表示第一行第一列的元素的大小,為4個位元組

printf("%d\n",sizeof(a[0]));  \\16

第一行陣列名單獨放在sizeof內部,表示第一行元素的大小,為16個位元組

printf("%d\n",sizeof(a[0]+1));  \\4

第一行第乙個元素位址加1為 第一行第二個元素的位址,大小為四個位元組

printf("%d\n",sizeof(*(a[0]+1)));  \\4

第一行第二個元素大小,為4個位元組

printf("%d\n",sizeof(a+1));  \\4

首元素(第一行)位址加1 為第二行的位址,大小為4

printf("%d\n",sizeof(*(a+1)));  \\16

第二行元素的大小,為16個位元組

printf("%d\n",sizeof(&a[0]+1));  \\4

第一行的陣列名取位址是第一行的位址 加1是第二行的位址,大小為4個位元組

printf("%d\n",sizeof(*(&a[0]+1)));  \\16

第二行元素大小,為16個位元組

printf("%d\n",sizeof(*a));  \\16

第一行的大小,為16個位元組    *(a+0)== a[0]

printf("%d\n",sizeof(a[3]));  \\16

sizeof內部表示式不參與運算,算的是一行的元素的大小,不存在越界。大小為16個位元組。

指標和陣列相關的練習題。

前幾天學完了指標,今天就來做一些經典的題來鞏固自己的知識。1.int main int ptr int a 1 printf d,d a 1 ptr 1 return 0 解析 首先這道題答案是2,5.因為首先它先定義乙個陣列,然後定義乙個指標變數指向下乙個陣列。a 1表示對第二個元素的位址,在解引...

指標陣列和陣列指標

有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...

指標陣列和陣列指標

理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...