目录:
- 二维数组概述
- 二维数组类型指针详解
- 一维数组类型指针详解
- 数组名的特殊性质
- 指针大小的确定
- &a 与 &a[0]的区别及演示
- 总结
1. 二维数组概述
二维数组是指数组中的每个元素又是一个数组,它们的特点是元素类型相同,但是值可以不同。例如:
int a[2][3] = {{3,6,2},{1,9,7}};
这是一个包含两个小数组的二维数组,其中第一个小数组的值为3、6、2,第二个小数组的值为1、9、7。
2. 二维数组类型指针详解
二维数组类型指针,指向的是整个二维数组的地址。例如:
int (*p)[2][3] = &a;
这里的(&a)
是整个二维数组的地址,变量p
是一个指向二维数组的指针。(*p)
的用法与a
相同,a[1][1]
等价于(*p)[1][1]
。可以通过p
来访问整个二维数组的所有元素。
3. 一维数组类型指针详解
一维数组类型指针指的是数组中每个元素的地址,例如:
int(*p1)[3] = &a[0];
变量p1
指向二维数组a
的第一个小数组,a[0]
也是一个数组,其大小为3,所以p1
的类型是一个一维数组类型的指针。与二维数组类型指针类似,(*p1)
的用法与a[0]
相同,a[0][0]
等价于(*p1)[0]
。可以通过p1
访问二维数组中的第一个小数组。
int(*p2)[3] = &a[1];
变量p2
指向二维数组a
的第二个小数组,同样,p2
的类型是一个一维数组类型的指针。与二维数组类型指针类似,(*p2)
的用法与a[1]
相同,a[1][1]
等价于(*p2)[1]
。可以通过p2
访问二维数组中的第二个小数组。
4. 数组名的特殊性质
在C语言中,数组名是一个指向其第一个元素的指针。对于二维数组a
,a
的值等于&a[0]
。因此,可以使用以下方法来初始化一个指向二维数组的指针:
int(*p)[3] = a;
变量p
被初始化为指向二维数组a
的第一个小数组,这里和一维数组类型指针的写法相同。与一维数组类型指针相似,p
和数组名a
的用法也一模一样。例如,a[0][1]
等同于p[0][1]
。
5. 指针大小的确定
在C语言中,所有的指针(无论是什么类型)都有固定的大小,在32位编译环境下是4
字节,在64位编译环境下是8
字节。这是因为指针就是一个内存地址,而内存地址的大小也是固定的,因此指针的大小也是固定的。
6. &a 与 &a[0]的区别及演示
&a
和&a[0]
虽然都表示二维数组a
的地址,但是它们的类型却不一样。前者的类型是一个指向包含两个小数组的二维数组的指针,而后者的类型是一个指向第一个小数组的指针。
对于&a
,加1
会加上整个二维数组的大小,而对于&a[0]
,加1
会加上一个小数组的大小。例如:
printf("%p\n", &a);
printf("%p\n", &a[0]);
printf("%p\n", &a[1]);
printf("%p\n", &a[0][0]);
输出结果为:
0x7ffee1a9aca0
0x7ffee1a9aca0
0x7ffee1a9aca6
0x7ffee1a9aca0
这里可以看到,&a
和&a[0]
的数值是一样的,但是类型不同。加1
时,&a
加整个数组的大小,&a[0]
加一个小数组的大小。
7. 总结
本文详细介绍了二维数组、二维数组类型指针、一维数组类型指针、数组名的特殊性质、指针大小和&a
与&a[0]
的区别和演示。希望对读者有所帮助。