今天在csdn的c版看到了这样的一个帖子:http://community.csdn.net/Expert/topic/4264/4264741.xml?temp=.8964502 问的是数组和指针的区别.但最后引出的却是"数组名是指针吗?"这样一个问题.
其中megaboy(飞天御剑流之杀神一刀斩) 的回答与众不同,按他对数组名的理解:数组名是一个符号地址常量,这个解释确实可以解释一些现象,但还有很多不能用这个来解释的问题.
比如我在那个帖子里提到的两个程序:
1,include<stdio.h>
main()
{
int a[]={1,2,3};
int *p;
p=a;
printf("%d\n",p);
return 0;
}一个符号地址常量怎么可以对一个指针赋值呢?
2,又比如,printf的参数要求是一个指针,按megaboy的说法下面的程序肯定不成立.
#include<stdio.h>
main()
{
char a[]="wayne";
printf(a);
return 0;
}但结果是打印出wayne
晚上迎接新生回来以后,查了一下<<c++ primer 第三版>>和<<c++程序设计语言 特别版>>.前一本书上没有提太多这方面的东西,在7.9.2节只有一句话提到:"不带下标操作符的数组名会被解释成指向首元素的指针".后一本讲的多一点,在5.3节:"到数组的指针"中把这个问题大致讲了一下:"一个数组的名字能够被用作到它的开始元素的指针.
如 int v[]={1,2,3,4};
int *p1=v;//指向开始元素(隐式转换) 隐式地从int [ ] 转换到int *
从数组名到这个数组的开始元素的指针的隐式转换,在c风格代码的函数调用中广泛使用."
至于到底是怎么转换地,我想没有必要了解的那么多.
所以我还是认为"不带下标操作符的数组名会被解释成指向首元素的指针".这样好理解.但是数组名是不能被修改的,它是一个常量,不能进行任何赋值或加减的运算.