指針和數組(補充)
阿新 • • 發佈:2017-10-08
關於 [1] use 取值 clas 什麽 clu sys spa
關於指針地址和數組首地址的關系總感覺沒有說清,所以今天有對其進行了一下補充;
#include <stdio.h> #include <string.h> #include <stdlib.h> void main() { int a[3][3] = {{12,23,34},{21,45,554},{45,65,76}};//定義一個二維數組 相當於分成了三層,每層分配了三個int型變量 共36個字節 int (*b)[3];//數組指針是一個指向數組的二級指針(本質是一個指針)指針b分配了 4 個字節的空間 int *c[3];//指針數組 每個地址上裝的是指針 分配了12個字節空間,一個指針是4個字節,則3個指針分配12個字節 b = a;//將數組的地址賦給b printf("sizeof(a)%d sizeof(b):%d sizeof(c):%d\n",sizeof(a),sizeof(b),sizeof(c));//36 4 12 printf("%d\n",sizeof(a[0]));//12 a[0] 代表著a[0][0] a[0][1] a[0][2] 三個變量的空間 所以是12個字節 printf("%d\n",sizeof(a[0][0]));//4 代表一個變量 printf(" %d %d %d %d \n",&a,a,a[0],a[0][0]);//&a是去a的地址,a代表的是a的首地址它和a的地址一樣,a[0]是第一層的首地址,a[0][0]是從第一層的首地址裏取值 printf("%d %d\n",a[1],a[1][0]);//a[1] 是第二層的首地址 a[1][0]是從第二層的首地址中取出值 printf("%d %d %d %d\n",&b,b,b[0],b[0][0]);//&b是取b的地址,b是指針指向的地址,b[0]取出/修改 指針指向的地址,b[0][0]讀取/修改 b[0]空間上的值 system("pause"); }
當中我們可以看到數組的地址和數組的首地址是一樣的(不要問它們為什麽一樣,這個得問編寫編譯器的大佬們了):不過說說我的看法好了,這就好比下面這樣:
1 void main() 2 { 3 int a; 4 int *b; 5 a = 1;//我們可以這樣修改 a 的數值 6 printf("%d\n",a); 7 scanf("%d",&a);//可以通過自己輸入 8 printf("%d\n",a); 9 b = &a; 10 *b = 10;//還可以通過指針改 11 printf("%d\n",a); 12 scanf("%d",b);//通過指針的輸入 13 printf("%d\n",a); 14 system("pause"); 15 16 }
然後我們可以發現其實取地址就是通過指針來修改內存空間,說白了我們就是通過地址來操作我們的內存空間的,要是想問數組地址和元素首地址為什麽一樣,就好像是問為什麽 通過變量可以直接修改數值,而取地址也可以修改數值一樣,其實仔細想想它們差不多的(如果操作的空間都不一樣我們豈不是白操作了麽!),當然他們是有不同的,a和a[0]是不一樣的,a代表的是整個數組36個字節,a[0]代表第一層的三個變量的空間大小 12字節,而a[0][0]則代表第一層第一個元素的所以只有4個字節;
而指針的地址和指針所指向的地址是不一樣的;而所有的指針都只占4個字節的空間(不論是幾級指針,定義是這樣的),且指針的空間只能儲存地址而不能儲存值,所以指針的地址和指針所指向的地址是不一樣的的,它的內存空間上取出來的只能是地址,不能是數值;
指針和數組(補充)