纳闷的问题指针

#include<stdio.h>
main()
{
char *p[]={"12345","asdfg","ASDFG"};
printf("%s",*++p);/*为什么错误???从语法上看并没有错啊*/
}
我觉得应该输出asdfg将p移到下一个指向asdfg首地址的指针然后在进行输出可是为什么编译不通过???如果换成printf("%s",*(p+1));则可以输出asdfg
而如下程序的*++p则又能通过
#include<stdio.h>
main()
{
char *p,a[5]={'1','2','3','4','5'};
p=a;
printf("%c",*++p);
}

1.数组名可以当成指针常量,该指针常量指向数组的第一个元素,例如:

char str[10]={'a', 'b'}; //未指定的数组元素自动赋值为0,0的ASCII码为NULL

char *p = str;

puts(str); puts(p); //如果用for (){ printf()} 打印,空字符将被打印出来。(ab );

在这种情况下,str 是指向数组第一个元素的指针,该指针是常量的,不能对它进行如 ++ --之类的操作。
2.数组名在函数中,被转换为一个普通的指向数组第一个元素的指针变量,可以对它进行运算,如++ --等;例如:

void assignNumbers(int data[], int n)

{

int i;

for (i = 0, i < n; i++)

{

*data = i;

data++;

}

}

int main(void)

{

int num[10], i;

assignNumbers(num, 10);

for (i = 0; i < 10; i++)

{

printf("%d", num[i]); //如果这里用 printf("%d", *num++) 就错了! num在这里是指针常量

} //不过可以 int *p =num; for () { printf("%d", *p++)}

return 0;

}

结果:0123456789
指针数组 typename *p[n] : 定义了一个数组,数组包含了n个指针变量p[0],p[1]......p[n-1];

例如: *p[3] = {"abc", "defg"}; sizeof(p) = 3*4 =12 (p 为数组名代表整个数组) *p[1] = "abc"...

p = &p[0] (p+1)=&p[1] , 符合一般数组的特性,除了数组中的元素是指针以外,和一般的数组没什么区别。数组名p 是个指针常量,不能直接进行指针运算,不过可以传递给函数来进行。可以通过p[x] (0<=x<n) 来对指针数组进行赋值,如: p[2] = "hijklm"; 否则,对数组中的每个指针进行初始化, 必须先分配p[x] 所指向的内存空间! 必须对分配结果进行判断 if ( p[x]=(typename *)malloc(n * sizeof(typename)) == NULL) 失败。
LZ肯定是把指向数组的指针和指针数组混一起了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-09-19
第一个例子中那个p是数组名,而不是一个指针变量,所以不能用自增自减运算。
如果你这样写就没问题了:
int main()
{
char * p[]={"12345","asdfg","ASDFG"};
char ** q = p;
printf("%s",*++q);
return 0;
}
第2个回答  2009-09-19
因为第一种的时候,p是一个char*的数组,数组名p是个常量,所以++p是不行的。
第二种情况,p是一个指向char的指针,所以可以执行++p
第3个回答  2009-09-19
p++是在这个数组指针上加了1,相当于指针指到了内存中数组的下一区域,也就是"ASDFG"后面了