以下是引用神话嵌入式在2014-11-25 14:07:53的发言:
char #include<stdio.h>
void main()
{
*available_resource[]={"coulor monitor",
"big disk",
"cray"
"on-line drawing routhing",
"mouse",
"keyboard",
"power cable"};
while(*(available_resource++)!=NULL)
{
while(*(*available_resource++)!='\0')
printf("%c",*(*available_resource));
}
}
Compiling...
CZhuanJiaBianChen_example.cpp
D:\vc6.0\Microsoft Visual Studio\MyProjects\CZhuanJiaBianChen\CZhuanJiaBianChen_example.cpp(81) : error C2105: '++' needs l-value
D:\vc6.0\Microsoft Visual Studio\MyProjects\CZhuanJiaBianChen\CZhuanJiaBianChen_example.cpp(83) : error C2105: '++' needs l-value
执行 cl.exe 时出错.
这是出的问题?
指针和数组在大多数情况下可以互换着用。但它们还是有本质的区别的,在你的代码里这种区别就表现出来了。数组名可以被看做是一个指针常量,它是不可修改的左值。所以一些有副作用的操作符就不能用在数组名上。比如自增自减等。对于字符指针和字符数组来说虽然表面看起来也是没有区别的,但它们的底层机制是完全不同的。在ANSI C中,如果像下面这样初始化一个字符指针:char *p = "abcd"。则这个字符串将被定义为只读,也就是说你无法通过下面这样修改这个字符串:*p = 'e'。这将导致程序出现未定义的行为。但数组却可以,像下面这样就是合法的:char a[] = "abcd"; *a = 'e'。运行之后数组内容会变成“ebcd”。
现在总结一下指针和数组的异同:
一、在声明的时候
除了在函数参数的声明中,数组和指针可以互换外,其它任何情况下的声明都不行。
二、在使用的时候
在引用的时候,你可以选择自己喜欢的形式,随便使用指针形式或者数组形式。仅仅是使用形式上*(p+2)= p[2]。其它情况请不要认为数组和指针是一样的。
三、在编译器处理时
在编译器处理时,数组是一个地址,而指针是一个地址的地址。
最后,给几个有趣的例子,试着实际运行一下:
int a[10]; int * p = a;
1、sizeof(a)与sizeof(p)一样吗?
2、&a 与 &p 一样吗?
3、用字符串常量分别初始化字符数组和字符指针,效果一样吗?当然,这一点上面已经讲过了,这里再给个更有趣的例子:putchar("0123456789"[1]);这个语句是对是错?这里之所以讲了这么多关于字符串常量的东西,是因为数组和指针本来已经够不好区分了,再加上字符和字符串的区分,那更是让人头疼,最后如果再加上变量和常量区分,那更是让人崩溃。但你必须把它们全部理清楚,要不然永远学不好C。