免费注册 查看新帖 |

Chinaunix

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

[C] c语言的尴尬:取常量地址 [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
11 [报告]
发表于 2004-08-26 14:19 |只看该作者

c语言的尴尬:取常量地址

^_^,数值是常量,可是常量不一定是数值啊?常量也可以是内容不变的变量啊。这样也就有了空间,也就有了地址了。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
12 [报告]
发表于 2004-08-26 14:23 |只看该作者

c语言的尴尬:取常量地址

我想知道取一个数值(不是常变量)的地址是什么意思?像上面的 & sz

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2004-08-26 14:27 |只看该作者

c语言的尴尬:取常量地址

aero,你这样越解释越说不过去。
数组名还有存放它的空间?

关于针对数组名称进行 & 运算,
尽管你可以有很多种理解,但唯一正确的解释就是:这是一个语法规定。

语法规定了,对数组名称进行 & 运算是合法的,其结果就是数组的第一个元素的地址。
这就是为什么“居然”不报错的原因。

评分

参与人数 1可用积分 +3 收起 理由
langue + 3 为什么没加分?

查看全部评分

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
14 [报告]
发表于 2004-08-26 14:29 |只看该作者

c语言的尴尬:取常量地址

编译器的处理是一样的,起码gcc是这样处理的。但是我们知道数组名只是一个代表数组首地址的数值(这点从数组名不可以自加减上就可以看出)。所以说&sz这样的写法,从概念本身是不负责任的,模糊的写法。就像有些人知道了一个叫NULL的宏就到处乱用一样,NULL是什么是:((void *)0)


  1. #include <stdio.h>;
  2. #include <stdlib.h>;

  3. int main(void) {
  4.         char    tmp[32];

  5.         printf("%p\n",tmp);
  6.         printf("%p\n",&tmp[0]);
  7.         printf("%p\n",&tmp);

  8.         exit(0);
  9. }
复制代码

打印的值是一样的。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
15 [报告]
发表于 2004-08-26 14:32 |只看该作者

c语言的尴尬:取常量地址

[quote]原帖由 "flw"]辈槐ù淼脑?颉?/quote 发表:


完了,乱了。

我也没说数组名有存放它的空间啊!!!

我一直在说数组名是一个数组首地址,是一个数值,是不占空间的。

&sz怎么打印只是一种规定。我们自己的概念要清晰。

论坛徽章:
0
16 [报告]
发表于 2004-08-26 23:47 |只看该作者

c语言的尴尬:取常量地址

看这个帖子好痛苦

论坛徽章:
0
17 [报告]
发表于 2004-08-27 00:30 |只看该作者

c语言的尴尬:取常量地址

我觉得先得弄清常量(整数, 字符, 浮点数, 枚举)是怎么存储的? 还有就是怎么参与计算的? 然后再去考虑取常量地址意义何在.

至于说 &sz 和 sz 仍是有差别的, 比较一下 sz + 1 和 &sz + 1 就可以知道. 将 sz 解释成数组首元素的地址可能是为了简洁的需要, 否则得用 &sz[0] 来表示. 而用 &sz 表示数组整体的首地址, 也是有必要的.

论坛徽章:
0
18 [报告]
发表于 2004-08-27 00:31 |只看该作者

c语言的尴尬:取常量地址

同时觉得有必要提醒一下
char *p1 = "abc";

char p2[] = "abc";
的不同, 对它们进行求值的结果都是一个字符串的首地址, 但
&p1 == p1; //
&p2 == p2; //
这就说明它们的存储方式是不一样的, 有时候就可能造成link时出问题.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
19 [报告]
发表于 2004-08-27 08:52 |只看该作者

c语言的尴尬:取常量地址

[quote]原帖由 "yichun"]? 而用 &sz 表示数组整体的首地址, 也是有必要的.[/quote 发表:


同意,sz和&sz的区别是在这里,他们都是一个地址,而sz+1和&sz+1的确就不一样,这就是C里面令人生畏的地址加常数的问题。呵呵。yichun提出了一个“整体地址”的概念,挺好,让人容易理解。

论坛徽章:
0
20 [报告]
发表于 2004-08-27 11:18 |只看该作者

c语言的尴尬:取常量地址

一直也没仔细归纳过这个问题,今天正好看到,就把脑子中的写出来,有点乱。

c++编译器一般不为const分配存储空间,而把这个定义保存到它的符号表里。
而且当const被使用时,它在编译时会进行常量折叠,
如:
const int size=4;
char arr[size];

复杂结构会分配空间,
如:
const int arr[]={1,2,3,4};

在存在外部连接时也会分配空间。
extern const int size=4;
在这种情况下就不能char arr[size];

还有先开始不知道值得。


还有被迫分配空间:
const x=1;
const int *p=&

还有其他情况我一时没想出来。

c中的const 和c++中的const 不同,注意。


还有另外一个
&sz 和 sz 的差别
只要了解指向数组的指针。
像下面用的
void func(char arr[][4],int len)
char (*parr)[4];


 
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP