p是个指针你知道吧.p的内容其实就是一段内存地址,而在p前加*号,就表示读出这段地址所表示的值是什么.
而一个一维数组的名字其实也是一个指针.比如有int a[5], 那么当你只用a时,a其实就是一个指针.
你可以让上面那个p=a,p就会指向那个数组.
但是你问题中是个二维数组a,设想它是由3个一维数组组成.
[ ][ ][ ] --第一行其实就是a[0]
[ ][ ][ ] --第二行是a[1]
[ ][ ][ ] --a[2]
所以p指向了第一行数组.
*p[i]读出了这个第一行数组中的值.
p[i]显示了这个第一行数组的内存地址.
int a[3][3]; *p; //分号改逗号 否则为*p 再添一个int 前缀
p=a[0]; //等效于 p = &a[0][0];
for(;i<10;i++)
printf("%d %d",*p[i],p[i]) //p为指针 p[i] 是整数 所以 *p[i] 非法
非要让编译过去可以这么改, 不过是操作的未知空间,行为不确定,可能程序直接飞掉
printf("%d %d",*(int *)p[i],p[i])
我们的数据是存放在内存中的,
在内存中的空间是有地址的,每个地址下存放了你的数据。
*p[i] 指向 内存地址
p[i] 指向 内存地址中存放的数据
上面是引用 而定义指针如int a[3][3]; *p;
这里的*p 只是起到定义的作用,取个名字而已,其实很好理解的
等你学了汇编就会很清楚了
*作用于指针时,它表示指针所指向地址处存放的内容。
而指针作为一个变量,它的值是一个内存地址。
*p[i] 指向 内存地址
p[i] 指向 内存地址中存放的数据
第一个是数组元素的地址,另一个是元素值