原帖由 jronald 于 2006-12-17 14:50 发表
extern引用好像只管根据名字传值,arr对外部来说就是整个数组的值,是这样吗?不太一致啊
[code]
#include <stdio.h>
char arr[] = "hello,world!";
int ii=0xabc;
void print_arr(void ...
原帖由 converse 于 2006-12-17 15:02 发表
C专家编程里面就有了。
原帖由 converse 于 2006-12-17 15:02 发表
C专家编程里面就有了。
原帖由 cugb_cat 于 2006-12-17 15:10 发表
一定要把C专家编程看一遍~~~
原帖由 jronald 于 2006-12-17 15:28 发表
为什么不把地址传给extern char *arr?
原帖由 zx_wing 于 2006-12-17 15:32 发表
什么意思?extern char * arr 只是个声明
原帖由 jronald 于 2006-12-17 15:39 发表
那为什么用extern char *arr引用的arr不是数组起始地址,完全可以实现,这样可以与原来的arr保持一致,不是更好?
原帖由 Edengundam 于 2006-12-17 16:11 发表
arr 编译后对应的地址是'h'所在的地址.
用arr看成指针之后, %p 打印 arr 内容. arr 取得数组中的前4个char作为值被返回了.
&arr 就看到数组的首地址了
我比较菜..说不太清楚
这个感觉和 c99 支持的可 ...
原帖由 whyglinux 于 2006-12-17 17:28 发表
>> 指针需要访存,取出存放在指针变量中的内容,解释成地址再使用。
这只适用于指针变量。对于指针常量(如 null 指针常量)以及由表达式计算得到的指针值不需要访问内存。
>> 而数组本身就是地 ...
原帖由 zx_wing 于 2006-12-17 15:46 发表
这个程序的目的,就是解释当一个数组名被解释成了指针后,会产生什么样的错误。由此可以看出数组名和指针的区别
>>那为什么用extern char *arr引用的arr不是数组起始地址
...
原帖由 whyglinux 于 2006-12-17 18:18 发表
>> 如果版主有不需要访存的指针表达式计算,请给出c代码和反汇编。
下面的表达式的计算都不需要进行内存访问:
复制代码
- (int*)0 + 10
- &x + 10 // x 是一个静态对象。
>> 版主你可 ...
原帖由 whyglinux 于 2006-12-18 09:41 发表
>> int a = 1; a++;
>> 我可以肯定的说上述代码不需要访存,因为我没有给出上下文环境以及平台,所以总能找出一种不需要访存的情况。
何出此言?为了进行 a++ 的计算,总是首先要从内存中取得 a ...
有兴趣的朋友可以自己看看反汇编,会发现没有访存操作,a是放在一个寄存器里的(在x86平台上,我推测是eax)。
原帖由 r2007 于 2006-12-18 13:14 发表
下面这个是立即数
复制代码
- (int*)0 + 10
- &x + 10 // x 是一个静态对象。
如果没有猜错的话,上面的如果作为右值的话,编译器会运算出结果,而目标代码中只有这个结果。
[code] int a = 1;
...
原帖由 whyglinux 于 2006-12-18 13:16 发表
To zx_wing
>> 有兴趣的朋友可以自己看看反汇编,会发现没有访存操作,a是放在一个寄存器里的(在x86平台上,我推测是eax)。
真的没有访存操作操作吗?那寄存器中的初始值是从哪里来的?
原帖由 mik 于 2006-12-18 13:21 发表
zx_wing这位朋友还是推测出来的,即使是放在 eax 也不能说明什么问题,gcc 根据情况而定
想要深入了解清楚,看gcc实现代码
原帖由 mik 于 2006-12-18 13:21 发表
zx_wing这位朋友还是推测出来的,即使是放在 eax 也不能说明什么问题,gcc 根据情况而定
想要深入了解清楚,看gcc实现代码
原帖由 whyglinux 于 2006-12-18 14:10 发表
>> 编译过后,初始化操作会被转换成一个立即数操作,例如:
>> mov 1, %eax
这是加了优化之后的情况吧?
优化是一种等价实现,强调的是结果的对等性,其具体的实现过程没有可比性,一般不能用 ...
为什么地址不一样?
因为编译器做了手脚了!这个问题不是语言的范畴,而是编译器的实现细节!
按照模块来编译的模式,,第一个.c文件编译后,arr数组已经在模块内分配空间了,但是第二个.c文件中没有这个arr的位置信息,只有在连接的时候,才连接到第一个.o的文件里的字符数组的地址。。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |