指针引用二维数组

xiaoxiao2021-02-28  126

#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"); }
转载请注明原文地址: https://www.6miu.com/read-18386.html

最新回复(0)