1. 程式人生 > >C語言二維陣列的指標及首地址問題

C語言二維陣列的指標及首地址問題

若arr是一維陣列名,我們知道*arr就是arr[0],就是*(arr+0)。因為arr是陣列的首地址,*arr就是取首地址所指元素,就是陣列的第一個元素。
同樣的道理,arr是二維陣列名時,*arr也是取arr的第一個元素,但是此時arr所指的元素是一個一維陣列,所以,實際上arr所指元素是一維陣列的首地址。
就按arr[3][4]這個例子來看:3行4列陣列arr可以理解為arr[0],arr[1],arr[2]這三個一維陣列(陣列含有4個元素)構成的二維陣列,*arr就是arr[0],而arr[0]就是第0行的首地址,也就是第一個陣列的首地址。*(arr+i)就是arr[i],就是第i行的首地址。
如果現在定義arr是字元型陣列,輸出*arr(也就是第一行的首地址)為0000,再輸出*(arr+1)就是0004,而不是0001,就可以說明arr是指向一維陣列的指標。

例子1:

// C++中的二維陣列.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
	int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};

	printf("%d\n", sizeof(a));  //48
	printf("%d\n", sizeof(a[0])); //16
	printf("%d\n", sizeof(a[1])); //16
	printf("%d\n", sizeof(a[2])); //16
	printf("*************************\n");
	printf("%d\n", sizeof(*a)); //16
	printf("%d\n", sizeof(*(a+1))); //16
	printf("%d\n", sizeof(*(a+2))); //16
	
	for(int i=0; i <3; i++)
	{
		int *p =a[i];  //第i行首地址
		for(int j=0; j < 4; j++)
			printf("%d\t", p[j]);
		printf("\n");
	}
	

	return 0;
}