高级语言程序设计课程第七次个人作业
https://edu.cnblogs.com/campus/fzu/2024C/
https://edu.cnblogs.com/campus/fzu/2024C/homework/13304
102400235
朱熙
int a;
这是定义了一个名为 a 的整型变量。它能够存储一个整数值
int a;
这里定义了一个名为 a 的指针变量,该指针指向一个整型数据。也就是说,变量 a 本身存储的是一个内存地址,而这个地址所指向的内存单元中存储着一个整数
int **a;
此定义表示 a 是一个指向指针的指针变量,并且这个被指向的指针指向的是整型数据。简单来说,a 存储的是一个指针的地址,而这个被指向的指针又指向一个整数
int a[10];
这是定义了一个名为 a 的整型数组,数组中包含 10 个元素,每个元素都是整型。在内存中,系统会为这个数组分配一块连续的存储空间,足以容纳 10 个整数。可以通过数组下标来访问数组中的每个元素,下标范围是从 0 到 9
int (a)[10];
这里定义了一个名为 a 的指针变量,它指向一个包含 10 个元素的整型数组。也就是说,变量 a 存储的是一个数组的地址,并且这个数组的每个元素都是整型
- printf("%d\n", sizeof(a));
输出结果:通常为 48(在 32 位系统下,假设 int 类型占 4 个字节)。
含义:sizeof 是一个操作符,用于获取对象或类型在内存中所占的字节数。这里 a 是一个二维数组,它的类型是 int[3][4],即一个包含 3 个一维数组(每个一维数组包含 4 个 int 类型元素)的二维数组。在内存中,系统会为这个二维数组分配连续的存储空间来存放所有元素。因为每个 int 元素占 4 个字节,二维数组一共有 3 * 4 = 12 个元素,所以总共占 12 * 4 = 48 字节,因此 sizeof(a) 返回的就是二维数组 a 在内存中所占的字节数。 - printf("%d\n", sizeof(a[0][0]));
输出结果:通常为 4(假设 int 类型占 4 个字节)。
含义:a[0][0] 表示二维数组 a 的第一行第一列的元素,它是一个 int 类型的变量。sizeof(a[0][0]) 就是获取这个单个 int 元素在内存中所占的字节数,所以返回值就是 int 类型的字节大小,一般为 4 字节。 - printf("%d\n", sizeof(a[0]));
输出结果:通常为 16(在 32 位系统下,假设 int 类型占 4 个字节)。
含义:a[0] 在这里实际上是二维数组 a 的第一行,它的类型是 int[4],即一个包含 4 个 int 类型元素的一维数组。sizeof(a[0]) 就是获取这个一维数组在内存中所占的字节数。因为每个元素占 4 个字节,一维数组有 4 个元素,所以总共占 4 * 4 = 16 字节,因此 sizeof(a[0]) 返回 16。 - printf("%d\n", sizeof(a[0] + 1));
输出结果:通常为 4(假设指针类型占 4 个字节)。
含义:a[0] 是二维数组 a 的第一行(类型为 int[4]),当对它进行 + 1 操作时,根据数组指针的运算规则,它会指向第一行的第二个元素的地址(这里把 a[0] 看作是指向其第一个元素的指针)。所以 a[0] + 1 的类型是 int *(指向 int 类型的指针),sizeof(a[0] + 1) 就是获取这个指针在内存中所占的字节数,一般指针类型在 32 位系统下占 4 个字节,所以返回 4。 - printf("%d\n", sizeof(*(a[0] + 1)));
输出结果:通常为 4(假设 int 类型占 4 个字节)。
含义:由前面的分析可知,a[0] + 1 指向第一行的第二个元素的地址,那么 (a[0] + 1) 就表示通过这个指针获取到的元素值,也就是二维数组 a 的第一行第二列的元素,它是一个 int 类型的变量。所以 sizeof((a[0] + 1)) 就是获取这个单个 int 元素在内存中所占的字节数,返回值为 4。 - printf("%d\n", sizeof(a + 1));
输出结果:通常为 4(假设指针类型占 4 个字节)。
含义:a 是二维数组名,它本质上是一个指向二维数组首行的指针(类型为 int ()[4]),当对它进行 + 1 操作时,根据二维数组指针的运算规则,它会指向二维数组的第二行的地址。所以 a + 1 的类型是 int ()[4](指向包含 4 个 int 元素的一维数组的指针),sizeof(a + 1) 就是获取这个指针在内存中所占的字节数,一般指针类型在 32 位系统下占 4 个字节,所以返回 4。 - printf("%d\n", sizeof((a + 1)));
输出结果:通常为 16(在 32 位系统下,假设 int 类型占 4 个字节)。
含义:由前面分析可知,a + 1 指向二维数组的第二行的地址,那么 (a + 1) 就表示通过这个指针获取到的内容,也就是二维数组的第二行(类型为 int[4])。所以 sizeof((a + 1)) 就是获取这个一维数组在内存中所占的字节数,因为每个元素占 4 个字节,一维数组有 4 个元素,所以总共占 4 * 4 = 16 字节,因此 sizeof((a + 1)) 返回 16。 - printf("%d\n", sizeof(&a[0] + 1));
输出结果:通常为 4(假设指针类型占 4 个字节)。
含义:&a[0] 是获取二维数组 a 的第一行的地址,它的类型是 int ()[4],当对它进行 + 1 操作时,根据指针运算规则,它会指向二维数组的第二行的地址。所以 &a[0] + 1 的类型是 int ()[4](指向包含 4 个 int 元素的一维数组的指针),sizeof(&a[0] + 1) 就是获取这个指针在内存中所占的字节数,一般指针类型在 32 位系统下占 4 个字节,所以返回 4。 - printf("%d\n", sizeof((&a[0] + 1)));
输出结果:通常为 16(在 32 位系统下,假设 int 类型占 4 个字节)。
含义:由前面分析可知,&a [0] + 1 指向二维数组的第二行的地址,那么 (&a [0] + 1) 就表示通过这个指针获取到的内容,也就是二维数组的第二行(类型为 int [4])。所以 sizeof ((&a [0] + 1)) 就是获取这个一维数组在内存中所占的字节数,因为每个元素占 4 个字节,一维数组有 4 个字节,所以总共占 4 * 4 = 16 字节,因此 sizeof ((&a [0] + 1)) 返回 16。 - printf("%d\n", sizeof(a));
输出结果:通常为 16(在 32 位系统下,假设 int 类型占 4 个字节)。
含义:a 是二维数组名,本质上是一个指向二维数组首行的指针(类型为 int ()[4]),那么 a 就相当于获取到了二维数组的首行(类型为 int[4])。所以 sizeof(a) 就是获取这个一维数组在内存中所占的字节数,因为每个元素占 4 个字节,一维数组有 4 个元素,所以总共占 4 * 4 = 16 字节,因此 sizeof(*a) 返回 16。 - printf("%d\n", sizeof(a[3]));
输出结果:通常为 16(在 32 位系统下,假设 int 类型占 4 个字节)。
含义:虽然二维数组 a 定义的大小是 3 行 4 列,但在 C 语言中,数组下标是从 0 开始的,所以 a[3] 实际上已经超出了数组 a 的有效范围。然而,根据 C 语言的规定,编译器并不会在编译时发现这种越界访问的错误(除非开启了特定的越界检查功能)。在这里,a[3] 的类型依然被认为是 int[4],即一个包含 4 个 int 类型元素的一维数组。所以 sizeof(a[3]) 就是获取这个一维数组在内存中所占的字节数,因为每个元素占 4 个字节,一维数组有 4 个元素,所以总共占 4 * 4 = 16 字节,因此 sizeof(a[3]) 返回 16。