指針引用二維數組

#include<stdio.h>
#include<stdlib.h>

void main1()
{
	int num[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
	printf("%p,%p,%p\n", num, &num, *num);
	printf("%d,%d,%d\n", sizeof(*num), sizeof(*&num), sizeof(**num));		//16  48  4
	//num是二維數組的數組名,也是二維數組中第一個一維數組的首地址(行指針),按照此地址取出數據即第一個一維數組,有4個元素,所以佔16個字節
	//&num是整個二維數組的首地址,按照此地址取出數據即整個二維數組(指向二維數組的指針),有12個元素,所以佔48個字節
	//*num是第一個一維數組的數組名,也是第一個一維數組的第一個元素的首地址,按照此地址取出數據,是一個int類型的數值,所以佔4個字節

	//int num1 = 10;
	//double db1 = 10.9;

	//int *p1 = &num1;
	//double *p2 = &db1;

	//printf("%d,%d\n", sizeof(*p1), sizeof(*p2));

	system("pause");
}

void main2()
{
	int num[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
			//printf("%d,%p  ", num[i][j], &num[i][j]);
			printf("%d,%p  ", *(num[i] + j), num[i] + j);
		putchar('\n');
	}

	printf("%p,%p,%p\n", num, num + 1, num + 2);		//num是一個行指針,指向的數據爲一行有四個int類型數值的數組
	printf("%p,%p,%p\n", *num, *num + 1, *num + 2);		//num是二維數組名稱,也是第一個一維數組的首地址,根據其首地址取出的是第一個一維數組,
														//同時一維數組(名稱)就是其第一個元素的首地址,所以*num是第一個元素的首地址,以此類推
	printf("%p,%p,%p\n", *(num + 1), *(num + 1) + 1, *(num + 1) + 2);
														//num是二維數組的名稱,也是其第一個元素(一維數組)的首地址
														//num+1即第二個一維數組的首地址
														//*(num + 1)即第二個一維數組,又是第二個一維數組的第一個元素的首地址
	//num[i][j] = *(*(num + i) + j);
	
	printf("===========================\n");
	printf("%p,%p,%p\n", num, num + 1, num + 2);
	printf("%p,%p,%p\n", *num, *(num + 1), *(num + 2));
	printf("%p,%p,%p\n", num[0], num[1], num[2]);
	printf("%d,%d,%d\n", sizeof(num), sizeof(*num), sizeof(num[0]));

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

	printf("----------------------------\n");
	printf("%d,%p\n", *(num[2] + 3), num[2] + 3);
	printf("%d,%p\n", *(*(num + 2) + 3), *(num + 2) + 3);
	printf("%d,%p\n", num[2][3], &num[2][3]);

	system("pause");
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章