c语言 数组问题

看见彩虹 2012-01-26 11:04:25
定义一个数组char a[20]
那么&a,a和&a[0]都是什么意义有区别么?
求详细解释。谢谢。


a是一个指针,表示这个数组的首地址,即这个指针内存放着的数组第一项的位置;
a[0]指的是第一项,是一个char型,&a[0]就是第一项的位置,故&a[0]与a是同一个意义,表示数组的首地址;
&a指的是这个指针a的地址,即a这个指针所存放的位置的地址,与前两者不一样;
这个对不对?如果对,那么一整形输出时三个的值为什么一样呢?不对求解释。
...全文
237 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
caddor 2012-01-29
  • 打赏
  • 举报
回复

&a 是指针数组


[Quote=引用 17 楼 nk_wang 的回复:]

&a 是数组的首地址,即首元素的地址;
a 是数组名;
&a[0] 是元素a[0]的地址,与&a表示相同值;
[/Quote]
nk_wang 2012-01-29
  • 打赏
  • 举报
回复
&a 是数组的首地址,即首元素的地址;
a 是数组名;
&a[0] 是元素a[0]的地址,与&a表示相同值;
Naugineer 2012-01-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 wugou111 的回复:]
定义一个数组char a[20]
那么&a,a和&a[0]都是什么意义有区别么?
求详细解释。谢谢。


a是一个指针,表示这个数组的首地址,即这个指针内存放着的数组第一项的位置;
a[0]指的是第一项,是一个char型,&a[0]就是第一项的位置,故&a[0]与a是同一个意义,表示数组的首地址;
&a指的是这个指针a的地址,即a这个指针所存放……
[/Quote]
&a[0]是数组a中首个元素的地址,&a是数组a的地址,所以&a[0]与 &a是同一个意义。但是a是数组名,我觉得还是不能和&a看成一个意义,尽管本质上数组和指针之间联系很紧。
看见彩虹 2012-01-29
  • 打赏
  • 举报
回复
还有四楼的也很管用。
看见彩虹 2012-01-29
  • 打赏
  • 举报
回复
首先谢谢大家。刚来csdn不太熟悉,不好地方见谅啊 。

回九楼:
arr 是数组名,可以隐式转换成首元素的指针,这时元素类型是int,所以可以转换成int*
这句话中的元素是指什么啊?不太明白什么转换成int*,还有就是int*有什么叫的名字吗?
另外就是和这个题目没什么关系的问题是比如:int *p=arr[5];这个p是不是是一个地址?

一楼:
那个英文的解释是自己写的吗?有地方能找到这种英文的解释吗?
Ever_lover 2012-01-29
  • 打赏
  • 举报
回复
&a,&a[0]遇到二维数组的时候就有区别了,自己test下 既不大庆了
labi_xiaoxin 2012-01-28
  • 打赏
  • 举报
回复

a是数组名, *a 是指向数组的指针,指针指向的是这个数组的首地址。
&a 和 &a[0] 也是这个数组的首地址。
一个意思。所以值是一样的。
bluewanderer 2012-01-26
  • 打赏
  • 举报
回复
请注意&a的类型是char (*)[20],*a的类型可是char,&a[0]或者&*(a + 0)的类型是char *
chouxiaoya8100 2012-01-26
  • 打赏
  • 举报
回复



*a

两部动作, &a,然后 *a

所以*a 指的是数组首元素



[Quote=引用 5 楼 chouxiaoya8100 的回复:]
a不是指针,是个名字,,


&a 是数组首元素的地址

&a[0]同上






引用楼主 wugou111 的回复:
定义一个数组char a[20]
那么&a,a和&a[0]都是什么意义有区别么?
求详细解释。谢谢。


a是一个指针,表示这个数组的首地址,即这个指针内存放着的数组第一项的位置;
a[0]……
[/Quote]
chouxiaoya8100 2012-01-26
  • 打赏
  • 举报
回复
a不是指针,是个名字,,


&a 是数组首元素的地址

&a[0]同上





[Quote=引用楼主 wugou111 的回复:]
定义一个数组char a[20]
那么&a,a和&a[0]都是什么意义有区别么?
求详细解释。谢谢。


a是一个指针,表示这个数组的首地址,即这个指针内存放着的数组第一项的位置;
a[0]指的是第一项,是一个char型,&a[0]就是第一项的位置,故&a[0]与a是同一个意义,表示数组的首地址;
&a指的是这个指针a的地址,即a这个指针所存放……
[/Quote]
mymtom 2012-01-26
  • 打赏
  • 举报
回复
下面的例子可以帮助理解

#include <stdio.h>

int main(int argc, char *argv[])
{
char a[20];

printf("%p\n", a);
printf("%p\n", a + 1);

printf("%p\n", &a[0]);
printf("%p\n", &a[0] + 1);

printf("%p\n", &a);
printf("%p\n", &a + 1);

return 0;
}
ProgrammingRing 2012-01-26
  • 打赏
  • 举报
回复

#include <stdio.h>

int main(void)
{
char array[20];
char (*p)[20];

p = &array;

printf("%p\n", array);
printf("%p\n", p);
printf("%p\n", &p);

return 0;
}

&a是数组指针。。输出后是指向的值,也就是array的地址嘛。。和上面代码一样。。我是这样理解的。。不对还请指正
mymtom 2012-01-26
  • 打赏
  • 举报
回复
&a指的是这个数组a的地址,即a这个数组的起始地址,在值上与前二者一样。
mymtom 2012-01-26
  • 打赏
  • 举报
回复

a[20];

&a - pointer to array of char, the array has 20 member
a - array of char
&a[0] - pointer to char
xaojin2011 2012-01-26
  • 打赏
  • 举报
回复
a的类型是char (*)[20],


错了, char s[5][20]的 会退化为char(*)[20];

它的类型就是char s[20],最高纬度





[Quote=引用 7 楼 bluewanderer 的回复:]
请注意&a的类型是char (*)[20],*a的类型可是char,&a[0]或者&*(a + 0)的类型是char *
[/Quote]
AnYidan 2012-01-26
  • 打赏
  • 举报
回复
http://blog.csdn.net/supermegaboy/article/details/4855027
iamnobody 2012-01-26
  • 打赏
  • 举报
回复
首先,数组是一个拓展类型。一个数组对象是一个聚集,同时,它也是一个对象!是一个整体!c语言提供数组到其首元素指针的转换是为了方便写程序,不是说数组名就是XXX,数组名就是一个对象的名字。和其他对象的名字一样,都是一个标识符,用来代表某个对象。

int arr[3];
arr 是数组名,可以隐式转换成首元素的指针,这时元素类型是int,所以可以转换成int*
int* p = arr;//正确.
int*p = &arr[0];//与上面效果一样.

int arr2[3][2];
arr2 是数组名,可以隐式转换成首元素的指针,这时元素类型是int [2];//是一个一维数组.所以可以转换成int(*)[2];//指向数组的指针.

int (*p)[2]=arr2;//正确.
int (*p)[2] = &arr2[0];//与上面效果一样.



对于*arr是怎么理解的?



*arr;//很明显,数组本身是不存在*(解引用)操作的.于是数组转换成首元素的指针,再被解引用.

*(arr + 0)//这样写也是一样的.不过这里是因为加法操作而转换成指针.


实际上,除了在sizeof(),和&操作之外,其他情况都会转换成指针.

你试试:
int arr[3];
sizeof(arr);
int * p = &arr;//错;
int (*P)[3] = &arr;//对/


对于二维数组:

int arr[3][2];
*arr;//这里跟上面一样,转换成首元素指针,于是*arr表示int [2]数组.

试试:sizeof(*arr) == 8;
int (*)[2] = &*arr ;

**arr;//之所以可以这么写是因为上面转换成来的 int [2];数组还可以再次转换成首元素指针.再次被解引用,实际上这样更直观 *(*arr);

数组名绝不不是就是指针.二维数组名更不是就是二维指针,详见我上面的链接....
小班得瑞 2012-01-26
  • 打赏
  • 举报
回复
这些东西...建议看《C和指针》,上边讲得很详细

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧