1. 程式人生 > >指針和數組(補充)

指針和數組(補充)

關於 [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個字節的空間(不論是幾級指針,定義是這樣的),且指針的空間只能儲存地址而不能儲存值,所以指針的地址和指針所指向的地址是不一樣的的,它的內存空間上取出來的只能是地址,不能是數值;

指針和數組(補充)