免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: lunight
打印 上一主题 下一主题

[函数] 高手问题:一个数组和函数地址的问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-12-18 16:11 |只看该作者
原帖由 whyglinux 于 2006-9-20 12:24 发表


当 array_name 数组对象是一个左值的时候(通过定义产生的数组都是一个左值对象),可以对其进行取址运算。取址运算 &array_name 的结果是一个指向数组这个对象的指针。在一般情况下(非 sizeof 或者 &am ...



你说的这个"左值"和"右值"是个什么概念?  我都没听说过,还是在哪本书里可以找的到?希望指点..谢谢  whyglinux!

论坛徽章:
0
22 [报告]
发表于 2006-12-18 16:33 |只看该作者
To veryperson

一句话:用 google,搜。

如果想找中文资料,不妨以 左值 和 右值 作为关键字;如果想找英文资料,以 lvalue 和 rvalue 作为关键字。

论坛徽章:
0
23 [报告]
发表于 2008-05-10 22:35 |只看该作者
……
完全蒙。。。。。。。。。。

论坛徽章:
0
24 [报告]
发表于 2010-09-16 09:28 |只看该作者
本帖最后由 omycle 于 2010-09-16 09:30 编辑

回复 12# neo_yang

数组和指针还是有区别的,char ss[20] =" ";这里ss代表着数组的首址,&ss代表着&ss[0],所以应该是一样的
而c ...
neo_yang 发表于 2006-09-19 11:49


    不好意思,这是一个老帖子,我还是翻出来了。
这里sizeof(code)是4吗?
我在gcc里面验证,并不是4,而是整个数组的大小。


  1. int add(int a, int b)
  2. {
  3.       return a+b;
  4. }
  5. void main()
  6. {
  7.         char a[] = {9, -12, 120, 8, -20, 100, 30, -89, 20};
  8.         char aa[]="wo ai beijing tian an men!\n";
  9.         printf("sizeof(a):%d\n",sizeof(a));
  10.         printf("sizeof(aa)%d\n",sizeof(aa));
  11.         printf("add(?,?)=%d\n",add(sizeof(aa),sizeof(aa)));
  12. }
复制代码

论坛徽章:
0
25 [报告]
发表于 2010-12-18 00:02 |只看该作者
char * p
p 是一个指针变量,其内容是一个地址;采取的间接访问。

array[]
array 是一个数组的首地址。可以赋给一个相应类型的指针。

论坛徽章:
0
26 [报告]
发表于 2010-12-18 09:30 |只看该作者
我写的一篇旧文,也翻出来供各位参考
http://sunxiunan.com/?p=1650

其实我们只要记住指针与数组的几个不同点,到时候类似问题就很容易搞掂了。在《C专家编程》里面列出一些,我这里简述一下:

第一点也是最关键一点,指针访问是间接的,也就是指针存放的是一个地址的值,存放的是被指内容的地址,其实类似一个中转站或者114的功能,如果想取得指针所指向的内容,必须做提领(deference)操作,实际上类似于两个步骤(先取得指针的内容也就是p存放的地址值,然后取得存放地址里面内容)。而数组里存放的就是数组的值,不是什么间接引用的地址,比如我们要取arr[5]的值,只要从arr开始数5个位置,里面就是a[5]的内容。

另外一点不同是,假如我们有个数组int array[5],数组的地址&array与数组名字array本身代表的地址是不一样的。&array实际上是一个int (*p1)[5]类型的指针,p1每一步递增递减都是sizeof(array),也就是5个int长度。而array相当于&array[0],也就是第一个元素(element)的地址,类型是int *p2,p2每一步递增都是sizeof(int)。这个区别在指向二维数组或者多维数组指针里非常需要注意。

再有一点不同是,一般指针类型(除了int *const p这种)都是没有名字的,可以随意的指来指去的,另外指针可以有加减计算,加上减去一定的值。而数组相当于,定义以后就不可以修改数组地址了,这也是前面一条我都会说有一个p1或者p2指针,而不是数组array本身。尽管数组array有类似指针的行为,也是某种地址,但是它不可以进行加减操作,我们可以认为数组array本身是一个常量。

还有一点不同是,指针可以初始化为NULL,另外可以声明为void指针,还可以声明非常复杂的函数指针、指针的指针、字符串指针等等,但是数组没法定义为函数数组。

什么情况下指针与数组的概念可交换?《C专家编程》总结的以及相当全面,我在这里简单列两条,深入的内容请看书。1)使用a这种形式对数组访问,编译器改写为*(a + i)形式,这也是为何i[a]这样写也编译运行通过的原因。2)作为函数参数时,数组会被修改为指向数组第一个元素的指针。

论坛徽章:
0
27 [报告]
发表于 2010-12-18 10:12 |只看该作者
对于函数指针而言 void (*f)(void);f=temcode()调用 f(); 跟f=&tempcode();调用f()结果应该一样

论坛徽章:
0
28 [报告]
发表于 2010-12-18 10:24 |只看该作者
置于第一个问题,要是换成char *,再加&就变成二级指针啦,肯定内容不一样啦

论坛徽章:
0
29 [报告]
发表于 2010-12-18 10:46 |只看该作者
char ss[128];

这样定义的数组名字ss是一个常数(代表一个地址)。
对常数不能再取地址。

但编译器设 ...
思一克 发表于 2006-09-19 10:03



       遇到类似问题 谢谢解答...

论坛徽章:
0
30 [报告]
发表于 2010-12-18 11:45 |只看该作者
你说的这个"左值"和"右值"是个什么概念?  我都没听说过,还是在哪本书里可以找的到?希望指点..谢谢  w ...
veryperson 发表于 2006-12-18 16:11



    可以放在“=”左边的叫左值,可以放在右边是右值。
一个常数2只能是右值,变量x既可以是左值,也可以是右值
但凡讲C,C++的书里面都会讲到这俩概念
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP