说说C里的多维数组

好玩的多维数组

Posted by mengxun on March 15, 2019

先看一段代码

Screen Shot 2019-03-16 at 13.39.34.png

输出

这段代码的输出在我的Mac上输出如下:

x[0] = 0x7ffeecd3ca30, x = 0x7ffeecd3ca30, &x = 0x7ffeecd3ca30
x[0] + 1 = 0x7ffeecd3ca34, x + 1 = 0x7ffeecd3ca38, &x + 1 = 0x7ffeecd3ca40

解释

第一行的的三个值都是数组第一个字节的地址,所以三个值都一样,这个没什么问题(&x的值是整个数组的地址,可以把它看作一个指向整个数组的指针,但是&x并不是指针)

第二行之所以出现三个值不一样,是因为:

  • x[0] 的值是整数1的地址,x[0] + 1 就等于地址加上int的长度
  • x 的值是一个含有两个整数的数组的地址,x + 1 就等于地址加上数组(含有两个整数)的长度
  • &x 的值是一个含有两个数组的数组的地址, &x + 1就等于地址加上数组 (含有两个数组)的长度

另外虽然数组名和指针看起来很像,但是数组名和指针是两回事,他们的区别主要在于:

  • 数组名等于数组首元素的地址,是一个常量
  • 指针是个存储地址的变量
  • 指针前加 & 等于指针的地址,数组名前面加 & 等于整个数组的地址
  • sizeof 后面加指针等于指针的长度,但是后面加数组名等于数组的长度