C&C++学习笔记(7)——指针

本章将对指针的问题进行汇总,会不断的更新。

本文仅供个人记录和复习,不用于其他用途

数组与指针

如果现在有下面一串c语言代码:

1
2
3
4
5
6
7
void main()
{
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ,12};
printf("\n%x", a);
printf("\n%x", *a);
printf("\n%x", &a);
}

那么,你觉得这三个a有什么区别吗?猛地一看,觉得这三个都是一样的,输出都是相同的。确实是这样,然而,它们还是存在着很大的不同。

a代表二维数组的第一个元素的地址,那么第一个元素就是一维数组,所以递增时要增加一个一维数组的大小。

*a代表一维数组的地址,所以递增只需要增加一个int的大小。

&a代表二维数组的地址,所以递增需要增加整个数组。

我们不妨试试看:

1
2
3
printf("\n%d", sizeof(*a));
printf("\n%d", sizeof(**a));
printf("\n%d", sizeof(*&a));

输出如下:

16
4
64

显然就验证了这一点。