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的地址值大小是一样的, 但他们的访问方式不一样...
题目如下:
#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的地址值大小是一样的, 但他们的访问方式不一样...
相关文章推荐
- 最近想写一个邮箱自动验证功能,在网上看了很多,写到自己上面出了很多问题,记录下来给后面的人一个参考
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
- 最近想写一个邮箱自动验证功能,在网上看了很多,写到自己上面出了很多问题,记录下来给后面的人一个参考
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
- 管理一个项目团队的问题就是要实现以十当一,而不是以一当十!世界上没有任何两个人是完全相同的,任何人管理自己的方式也没有完全一样的。因而以一当十的英雄式的工作方式不难实现,难的是把这些能以一当十的英雄聚到一起,变成以十当一的团队工作方式
- 一个以前没有注意的问题:java构造函数的执行顺序
- 你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的
- 每当我想查找一个我的博文的时候就想放弃CSDN,没有自己的搜索功能啊
- 一个很简单但是自己就没有注意的问题
- 有一个关于collectiview的问题,弄了很久自己也没有解决
- 以前没有研究过脚本的使用,所以昨天那个小问题可是让我费了好一番功夫,贴出代码给自己留个纪念!
- 有一个关于collectiview的问题,弄了很久自己也没有解决
- 问题:求两个字符串的最长公共子串。 要求:输入两个字符串,输出它们的最长公共子串,包括长度。 设计: 设计一个类 String,包括一个 len(字符串长度)和字符串指针 s。另有如下成员函数: ·
- 一个关于javaweb项目名处出现红叉,而项目下的目录和文件没有红叉的问题
- 解开一个困扰自己多时的小问题——从std::cout和endl说起
- CSDN 博客的代码高亮问题自己修复
- csdn没有以前活跃了!
- eclipse导入了一个java项目,没有jre system library问题
- 数据库SQL中的分钟表示应该使用MI(非常重要的一个问题,以前一直认为和java中一样,用mm就可以表示);校对规则(查询时区分大小写)
- 【转】ExtJS中的grid没有滚动条问题(grid作为form的一个item)