‘*’是指针的意思,如果是数组,那*a代表的是指向a的首地址,那不难看出*a就是的返回值就是数组a的第一个元素(即a[0])的值。
你应该知道a[0],a[1]`a[i]``之间是一个连续的地址,而*(a+i)表示从a向后偏移i个位置,即*(a+i)为*a后第i个位置,那容易看出这和a[i]是一个道理的
至于你说的“还有一个不明白的就是:看到有的地方说这个取地址运算符‘*’右边的变量必须是指针变量而下面却说对数组名进行一次“*”运算就得到数组元素地址。这个数组名是数组的首地址啊,是一个地址常量啊,不是变量啊”,我想你在仔细看下书的话应该不难看出在你申明数组a[]是中的a并不是一个常量,它的实质是一个首地址的申明。
指针这个问题对初学者来说是,一开始的确不太容易理解,但学懂了就发现其实还是比较好理解的。对于指针这个问题不是一两句就能讲清楚的,如果你对指针的实质有兴趣的话,可以去看下《计算机组成原理》。如果再有问题的话,欢迎讨论。
******************************************
请问你看的是哪本参考书啊?
还有你不是说:“我不明白的是,在有的书中看到这样说:a[i]与*(a+i)是等价的。它们怎么是等价的???真不明白。”么?所以我才给出的以上回答```而且在C里面数组本来也就是一个不太容易理解的知识点,你在用'*'的时候可以把它理解为指针,一个指向数组首地址的指针.至于你说的“这个数组名是数组的首地址啊,是一个地址常量啊,不是变量啊。”中的“地址常量”这个是你自己附会的概念吧,在C中数组名就是首地址的申明···
老实说我在初学的时候也是有很多地方不懂,也很喜欢去转牛角尖,但是如果尝试去理解书上的概念的话,慢慢消化,等理解深一点的时候疑惑就自然解开了···
*************************************************************
而且我觉得你的问题也并没有提清楚,如果我的上述回答仍不能对你有所帮助的话,那请你在仔细想想你的问题,稍微说详细点··· 我们再来讨论
*+数组名 就是改变的指针类型 数组本来就和指针有区别
a[i]与*(a+i)是等价的:因为a[i]就是第i行第0列的地址;*(a+i),对于二维数组,此时指针的移动是以“行”为单位进行的,也就是说a+i是是第i行的首地址,*(a+i)就是第i行第0列的首地址了;
你可以参考谭浩强的C语言书,他的书写的很清楚。
嗯,你看书看得比较细,值得鼓励的。
在此,首先看个简单的程序段:
main()
{ int a=5,*p=&a;printf("%d",*p);} 在这里,p是个指针变量是无可否认的。把a的地址赋予p,而*p表示了p这个指针变量指向的变量,也就是a,a被赋予5,那么*p事实上就是5。这就是*这个取内容运算符的表现了。
也就是说,p是被赋予了地址,*p才取到了这个地址的内容。书上说*后一定要跟的是指针变量,本质上是要表达的不过是*后面一定是一个能表示指针(地址)的东西。
同样的道理,在你定义的数组中,a是数组名,当然能够表示地址,那么*a就是能够取到内容的了。在这里你可能会迷惑着,为什么*a明明取到的是内容,怎么又会是取到的地址呢?这是因为呢,这个内容它就是一个可以表示地址的a[0],a[1],a[2]。
在这点上,就要你理解二维数组的了。二维数组是数据构造类型,就像结构体里面有装着结构体一样的道理,数组里也装着数组。二维数组里就是装着一维数组(一维数组里才是装着具体的数组元素),也就是a[3][3]里装着a[0],a[1],a[2];而a[0],a[1],a[2]又是可以表示一维数组的首地址的。所以说*a就只是取得了a[0];*(a+1)就只是取得了a[1];*(a+2)就只是取得了a[2].那么就有了在二维数组中,a[i]与*(a+i)是等价的的说法了。