免费注册 查看新帖 |

Chinaunix

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

[C] 以其昏昏,使人昭昭? [复制链接]

论坛徽章:
0
161 [报告]
发表于 2010-04-14 10:37 |只看该作者
回复 160# toniz


{:3_193:}
弟请wiki之,
In computer science, a memory address is an identifier for a memory location, at which a computer program or a hardware device can store data and later retrieve it. Generally this is a binary number from a finite monotonically ordered sequence that uniquely describes the memory itself.

百度上的解释是垃圾,请忽略。

论坛徽章:
0
162 [报告]
发表于 2010-04-14 11:02 |只看该作者
回复 161# gz80


    {:3_186:} 理解了~  变量名  变量值  地址          当然 还有代表这个词

论坛徽章:
0
163 [报告]
发表于 2010-04-14 11:52 |只看该作者
至于你所谓的“清华大学”和“北京海淀区清华园1号”其实是同一个概念
根本就与“名字”与“地址”不是一回 ...
gz80 发表于 2010-04-14 10:10

看lz如何:
对比下c 和python:
c中变量是有类型的,不存在没有类型的变量(void*是空类型)
可以有自定义变量,变量声明之后,在内存中(栈上或者堆上)
地址相当于堆变量的引用。
int x;
&x; 就是返回x在内存中的地址(这个操作并没有去声明新的变量)
在python中
变量是没有类型,引入了一个对象的概念,变量只是对对象的一个引用
例如a=3
表明一个创建过程在内存中创建3这个number型的对象,然后用a引用这个对象。
a= ()
a引用一个()的对象3 堆销毁。
所以python中的创建这个概念就类似于c中的赋值概念。

论坛徽章:
0
164 [报告]
发表于 2010-04-14 11:54 |只看该作者
回复149楼
不过不知道pmerofc 看没看过 90年代的c语言,里面的写法算法现在看来简直惨不忍睹,另外看编译器的代码,也跟天书一样。我想到这可能和当时的硬件有关系,现在我们用着19寸22寸的显示器,随便这么写都可以,也可能当初开发的时候为了节省屏幕空间。


要看是谁写的代码。可以看看Unix早期的代码,70年代写的。当然是那时的C,不符合ANSI,但很清楚,很经典。不到8000行写出一个操作系统。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
165 [报告]
发表于 2010-04-14 11:55 |只看该作者
变量、变量名、变量值、变量地址是截然不同的几个概念。弄明白了,严格区分开了,在学习由此拓展的其他知识时就会事半功倍;否则——写到书上就误人子弟,教给别人就会误导人家走很多弯路。

当然,这方面稍微有些不严谨并不会影响你去当一个coder;但绝对会影响你学习更高深的知识。



这是wikipedia关于变量的解释:
http://en.wikipedia.org/wiki/Variable_(programming)

摘录开头部分:
In computer programming, a variable is a facility for storing data. The current value of the variable is the data actually stored in the variable. Depending on the programming language in question, the data stored in the variable can be intentionally altered during the program run, thus causing its value to change, or vary, hence the name. The variable can be referenced by identifiers. In contemporary programming languages, even non-identical identifiers can refer to the same variable.

Variables in programming do not directly correspond to the notion of variables in mathematics. The closest mathematical notions are substitution and evaluation.



可见:在计算机科学上,变量是一种存储数据的东西。变量存储的东西可以被改变,这就是它被称为变量的原因。

我们可以通过标识符来访问变量。在很多语言里,可以用不同的多个标识符来访问同一个变量。



所以,int i 就定义了一个变量,这个变量被我们命名为i——i是标志符,不是变量;但我们可以通过i这个标志符来找到变量i。

通过c++的引用机制,我们可以再定义一个标识符j,让j同样和i代表的那个变量关联:
int &j=i;

注意i 、j都是一个标识符,而且它们还是不同的标志符,只是在背后,这两个标识符关联了同一个变量。


i、j关联的那个变量在哪里呢?
不知道。
根据程序逻辑的不同,编译器可以把它放在内存里,可以把它放到寄存器里,甚至还可以把它优化掉——不存在于内存,不存在于寄存器,只是干净利索的删除掉。


当然,大多数情况下,i、j关联的那个变量会被在内存里安排一个或多个存储单元。那么这个存储单元究竟在哪里?
我们可以用取地址操作符&得到这个信息——&i 或者 &j 都可以。


这里就可以很明显看出变量和标识符的区别了: 变量是一个实体,而标识符不是。就好像你是个实体,而你的名字不是一样。
但不管你有多少个名字、外号,你这个人的实体是不变的。离开了你这个实体,名字、外号就没有意义——你绝不等于你的名字,是吧?
通过你的名字(加上一些手续)可以找到你,但这和直接抓到你的手不同,是这样吧?



同样,拿到变量的名字,和知道你的名字一样;拿到变量的地址,就好像拿到了你的住址/座位号一样;但只有真的抓到了你的手,这才是实实在在知道了你究竟是什么样子。


所以,有以下关系:
1、标识符--寄存器--变量
2、标识符--内存地址--变量
3、标识符--因为从未被使用而没有生成变量


争论这个有什么用?也许你会疑惑。
我只能说,等你学到编译优化等知识时,就会知道不搞清楚这个会吃多大苦头了。

论坛徽章:
0
166 [报告]
发表于 2010-04-14 12:38 |只看该作者
回复149楼


要看是谁写的代码。可以看看Unix早期的代码,70年代写的。当然是那时的C,不符合ANSI,但很 ...
yug1129 发表于 2010-04-14 11:54


我看大部分的是
Copyright (C) 1993 -- Data I/O Corporation -- All Rights Reserved.
因为工作需要维护其代码,感觉读最初的代码很吃力,做电路图射击的应该知道这个公司
能不能把您说的8000行的代码发我一份zhwsh00@126.com
thx

论坛徽章:
0
167 [报告]
发表于 2010-04-14 12:50 |只看该作者
这个回复很赞同但是有些还不理解:

1:变量: 这个概念是语言层的,还是计算机科学层的。
2:这句话
##
所以,int i 就定义了一个变量,这个变量被我们命名为i——i是标志符,不是变量;但我们可以通过i这个标志符来找到变量i。

通过c++的引用机制,我们可以再定义一个标识符j,让j同样和i代表的那个变量关联:
int &j=i;

注意i 、j都是一个标识符,而且它们还是不同的标志符,只是在背后,这两个标识符关联了同一个变量。

i、j关联的那个变量在哪里呢?
不知道
###
请问如何不知道变量在哪里那么i = 3;和*j = 3如何理解成是为这个变量赋值而不是为标示符赋值呢。
另外关联这个词怎么解释?(这两个标识符关联了同一个变量)



变量、变量名、变量值、变量地址是截然不同的几个概念。弄明白了,严格区分开了,在学习由此拓展的其他知识 ...
shan_ghost 发表于 2010-04-14 11:55

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
168 [报告]
发表于 2010-04-14 12:51 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
169 [报告]
发表于 2010-04-14 12:54 |只看该作者
接上面:
c语言中,函数名,结构名也可以成为标识符,这个怎么解释?

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
170 [报告]
发表于 2010-04-14 12:57 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP