Bootstrap

C语言进阶习题【1】指针和数组(4)——二维指针

4. 二维指针练习(sizeof)

二维数组名和&二维数组名
二维数组名,指的是第一行的地址,+1会跳过第一行

&二维数组名,指的是整个数组地址 +1会跳过整个数组

4.1代码验证

#include<stdio.h>
#include<string.h>
int main()
{
    int a[3][4] = { 0 };
    printf("%d\n", sizeof(a));//a单独在sizeof里面,表示整个数组,求整个数组大小,3行四列,12个元素,是12*4 = 48字节
    printf("%d\n", sizeof(a[0][0]));//0行0列元素,求大小:4字节
    printf("%d\n", sizeof(a[0]));//a指的是第一行元素地址,a[0]是第一行的数组名,数组名单独放在sizeof内部,计算的就是数组(第一行)的大小:16个字节
	printf("%d\n", sizeof(a[0] + 1));//a[0]作为第一行的数组名,没有单独放在sizeof内部,没有取地址,表示的就是数组首元素的地址
	//那就是a[0][0]的地址,a[0]+1就是第一行第二个元素的地址,大小:4字节/32位机器 或 8字节/64位机器
	printf("%d\n", sizeof(*(a[0] + 1)));//a[0]+1是第一行第二个元素 对其解引用,取出的是第二个元素’0',大小:4字节
	printf("%d\n", sizeof(a + 1));//a指的是第一行元素地址,+1,值的是第二行元素地址,地址大小:4字节/32位机器 或 8字节/64位机器  //a类型 - int (*)[4]  a+1类型--> int(*)[4]
	printf("%d\n", sizeof(*(a + 1)));//a + 1 是第二行元素地址,解引用,*(a+1)表示的就是第二行,4个元素  大小:16字节
	printf("%d\n", sizeof(&a[0] + 1)); //&a[0]是第一行的地址,&a[0]+1是第二行的地址,地址大小:4字节/32位机器 或 8字节/64位机器
	printf("%d\n", sizeof(*(&a[0] + 1)));//*(&a[0] + 1) 是对第二行的地址解引用,得到的就是第二行,计算的就是第二行的大小 :16字节
	printf("%d\n", sizeof(*a));//a是第一行元素地址,解引用,计算的就是第一行的大小:16字节
	printf("%d\n", sizeof(a[3]));如果数组存在第四行,a[3]就是第四行的数组名,数组名单独放在sizeof内部,计算的是第四行的大小:16字节
return 0;
}

在这里插入图片描述

4.2代码分析

4.2.1 sizeof(a)

 sizeof(a)

在这里插入图片描述

4.2.2 sizeof(a[0][0])

 sizeof(a[0][0])

在这里插入图片描述

4.2.3 sizeof(a[0])

sizeof(a[0])

在这里插入图片描述

4.2.4 sizeof(a[0] + 1)

 sizeof(a[0] + 1)

在这里插入图片描述

4.2.5 sizeof(*(a[0] + 1)

sizeof(*(a[0] + 1)

在这里插入图片描述

4.2.6 sizeof(a + 1)

 sizeof(a + 1)

4.2.7 sizeof(*(a + 1))

sizeof(*(a + 1))

在这里插入图片描述

4.2.8 sizeof(&a[0] + 1)和 sizeof(*(&a[0] + 1))

sizeof(&a[0] + 1)
sizeof(*(&a[0] + 1))

在这里插入图片描述

4.2.9 sizeof(*a)

sizeof(*a)

在这里插入图片描述

4.2.11 sizeof(a[3])

sizeof(a[3])

在这里插入图片描述

;