cut the crap,看图:
http://instagram.com/p/RJpP5puqv0
之前看的一篇文章:Learning C using GDB,你可以看看 https://www.hackerschool.com/blog/5-l...
#include<stdio.h>
int main(){
int a[] = {1,2,3};
printf("a[0]=%d\n", a[0]);
printf("*(a+0)=%d\n", *(a+0));
printf("a[1]=%d\n", a[1]);
printf("*(a+1)=%d\n", *(a+1));
return 0;
}
array的index access在C里只是对指针操作的一个语法糖。a[n]
完全等价于*(a+n)
回到你的问题。
- C语言里
int a[10]
的话,a
是一个指针指向a[0]
的指针 - C语言里
int a[2][3]
的话,a[0]
是一个指向a[0][0]
的指针,a[1]
是一个指向a[1][0]
的指针
在你的代码里,int a[2][3]
*a
指向a[0][0]
这个inta
指向a[0] = {1, 2, 3}
这个array。只不过在C里面,array的地址就是array第一个元素的地址,所以在这里a = a[0] = a[0][0]
a
是*int[3]
的指针,对其进行+1操作,内存指针往后移动sizeof(int[3])
个位置*a
是int
指针,对其进行+1操作,内存指针往后移动sizeof(int)
个位置
你可以运行下面代码测试下
#include<stdio.h>
int main(){
int a[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
printf("%p\n", a);
printf("%p\n", a+1);
printf("%p\n", (*a+1));
return 0;
}