数组指针定义方式

书上看到两种定义数组指针的方式。
char a[10];
char (*p)[10]; //方式1
char *q; //方式2
p=a; //方式1
q=a; //方式2
我试了一下*(p+1)是不行的。*(q+1)是可以的。为什么?有什么区别?

1、p被定义成一个数组指针,它可以指向一个含有10个char元素的一维数组,具体的说是指向“一行”;
2、q被定义成一个字符指针,它可以指向一个char型的存储单元,因此q=a完全没问题,因为a就是&a[0],它表示char型存储单元的a[0]的地址;
3、p+1指向了a[10] ,也就是刚才数组a的“下一个元素个数为10的数组”,要想通过p访问a,可以通过下面的方式
p = &a;然后就可以按照下面的方式进行了。
*(*p+i),这样就访问到了 a[i]。例如下面的程序
#include<stdio.h>
void main()
{
char a[10];
char (*p)[10];
int i;
gets(a);
p=&a;
for(i=0;i<10;i++)
printf("%c ",*(*p+i));
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-14
p是一个指针,指向一个字符串数组的其地址 p+1是指向的地址+10*sizeof(char)
q是一个指向字符的指针 p+1是指向的地址+sizeof(char)
a是字符数组的起始地址,也可看做纸箱字符的指针
所以q=a可以
p=a,虽然能强转,但是*(p+1)是指向a[10]的地址,未定义内存,所以有问题追问

为什么p+1是指向的地址+10*sizeof(char)?谢谢

追答

指针值加1,加的是指向的内存数据类型的内存大小
因为p的指向的类型是包含10个字符的数组,所以+1 就是 + 10*sizeof(char)

第2个回答  2014-01-14
p是一个指针,指向一个char [10]的数据
q是一个指针,指向一个char数据,同时q也可以指向char[10]的起始元素
p=a,那么就是p指向了一个char [10]数组
q=a,就是q指向了char[10]数组的第一个元素

*(q+1) 就是char[10]数组的第二个元素,相当于a[1]
*(p+1)就是指向char[10]数组后面的有一个char[10]数组,这个没有,当然就不行了追问

char a[10];char (*p)[10]; //方式1char *q; //方式2
问一下方式1是定义了1个数据还是10个数据?

追答

定义的p是一个指针啊,一个指向char[10]数组的指针
char a[10] 才是有是个数据

相似回答