一个c指针问题

main()
{
int a[2][2]={1,2,3,4},*p=a;
printf("%d %d",p+1,*(p+1));
}
结果 -46 2
不明白 p+1 是数组元素3的地址么?
*(p+1)为什么是2,感觉p+1和*(p+1)应该是一样的都是3的地址
p指向a的首地址,p+1,不是相当于移一行么?

第1个回答  2008-11-14
p是列地址,如果声明为(*P)[2]就是行地址了.你如果能把行地址和列地址搞清楚,什么指针就都明白了.
再说了.你那样声明P本来就是错误的,二维数组的指针和一维数组的指针是不同的.
第2个回答  2008-11-14
p 是一指向数组a的指针
*p 就是a[0][0]的值1
p+1 是元素a[0][1]的地址
*(p+1) 是元素a[0][1]的值
第3个回答  2008-11-14
int *p=(int *)a; /*实际上经历了这样的隐含类型转换*/
p+1 == &a[0][1]; /*即a的第二个元素,值为2*/
-46==&a[0][1]; /*即a[][]的起始地址+4*/
第4个回答  2008-11-14
#include <stdio.h>

void main()
{
int a[2][2]={1,2,3,4},*p=*a;

printf("%d %d %d\n",p+1,*(p+1),&a[0][1]);
}

int *p=a要出错,应该改成 int*p=*a;
p+1是2的地址
1310580 2 1310580
Press any key to continue
第5个回答  2008-11-14
*(p+1)所指的是a[0][1] 含的值,即是2。
而p+1是表示a[0][1]的地址。