您的位置:首页 > 其它

CSDN 上面一个指针问题(以前自己没有弄清)

2008-06-10 23:42 459 查看
这是CSDN 网友发的一个帖子,在回帖的过程中发现自己其实也弄错了

题目如下:

#include <stdio.h>
#include <stdlib.h>
int  main(void)
{
    int a[3]={1,2,3};

    printf("%d/n",&a);

    printf("%d",a);
  return 0;
}
  我想问下 为什么&a 和 a的值会相同

其其实按照我的理解,a是数组的首地址,指向a[0]的,而&a是对它取地址,所以是数组首地址的指针,他们是不一样的。

但是我错了。

下面是CSDN一些网友的比较好的回复:

一。嗯,本来不想回的,但发现个问题
对于int a[3] = { 1, 2, 3 };
a和&a的确是相等的(指向同一个位置),但是其意义是不一样的,a指向的是第0个元素,&a指向的是整个数组.
不好理解的话对a和&a进行++操作就知道了,有兴趣的可以自己写代码看看.
所以本人不太接受对数组名取地址不合法这个说法.

 

二。在这里我想详细的讨论一下c语言的数组和指针

1. 指针是有类型的, 例如:整型指针, 浮点数指针
2. 除了void型的指针之外,其他的任何指针变量都告诉用户两个信息:一个是地址,另一个是访问方式
3. 在c语言中任何类型的指针都可以强制转化成其他任何类型的指针,所谓的指针的强制转换 只是转换了指针的
访问方式

[结论] 因此确切的说:a其实不能说是数组的地址,a和&a[0]是等价的, 他是a[0]的地址
                    &a才是数组的地址
    a和&a他们的大小是一样的, 但他们的访问方式不一样
  例如: int a[3]
  a代表的是 &a[0]他的类型是 int型的占四个字节
  &a代表的是 数组的地址 , 他是 int[3]数组类型的, 占12个字节

所以在进行指针运算的时候,a是以四个字节为单位的, 而&a是以12个字节为单位的,例如:
  a+3的地址值与&a+1的地址值大小是一样的, 但他们的访问方式不一样...

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  语言 c
相关文章推荐