user-0 提问: 小问题，很困惑

回复:
user: user-1
content: 地址就是一个位置 数据地址，是代表数据在内存位置的一种表示方法。通常用1个或者若干个整数表示。 地址和指针的关系是，地址本身是不牵扯这块内存内部数据类型的 指针是跟它指向的，这块内存里面的数据的类型，相关的，一种数据，是有类型的。 &取到的地址，本质上是一种指针数据， 虽然 &通常称之为，取址运算符，但是实际得到的结果，是一个指针。 这种附加了（内存中存储的）数据类型信息的地址，就是指针。  数组a 的名字 a， 作为表达式， 在 &a 中， a 直接表示数组本身， &a 数组的地址 &a[0] 是 a[0] 的地址  在表达式中 a， 单独出现的时候，通常解析为指针即 &a[0]; 因为 C，C++中，数组类型， 不能进行直接的读写（不能直接赋值）， 所以只能借助指针进行，操作。 所以早期的C语言，就直接用数组名 a， 表示数组第一个元素的地址了 至于后来的标准，和解释只是完善了一些概念。 对数组的定位，更加清晰了而已。 。。。。。。。。。。。。。。 实际上汇编语言中，变量只是对应一个地址 变量名常常作为地址（指针）使用。 不论是否数组，都可以。 。。。。。。。。。。。。。。。。。。。。。。 高级语言中，尤其是C，C++中， 只有数组，还保持数组名，可以当作地址（指针）使用的做法。 变量名，通常就表示变量的值。  变量地址（指向该变量的指针）， 就加个 & 来表示。  这样 变量和数组就产生了某种程度的不一致。 这就是 很多时候，提到数组，偏偏说是数组名的原因。 提到变量，就不说变量名了

user: user-2
content: mark，很收益，谢谢。

user: user-3
content: 引用 7 楼 NotSimpleEasy 的回复:[quote=引用 5 楼 ipqtjmqj 的回复:] [quote=引用 4 楼 ipqtjmqj 的回复:] 第1个在传参时自动转成第3个了， 第2个与第3个的区别，好比你在一辆火车的车头，火车离目的地的距离，等于，你离目的地的距离 注意，我说的第1个第2个第3个是你在代码外的这三句，而不是代码里面的 printf("%x,\n",a); printf("%x,\n",&a); printf("%x,\n",&a[0]); [/quote]    你的意思是a和a[0]是一样的？还是他两个加了取地址符就一样了。。我只能理解为a是1的地址，a[0]是1，他们两个同时取地址肯定是不一样的啊。。[/quote]  已经说了，是取址后值一样，但类型是不同的，所以是不能说是一样

user: user-0
content: 引用 24 楼 zhao4zhong1 的回复:http://edu.csdn.net/course/detail/2455/38534  我必认真学习，，，，，

user: user-4
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-4
content: http://edu.csdn.net/course/detail/2516 http://edu.csdn.net/course/detail/2517

user: user-0
content: 引用 22 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 这个和调试关系不大吧，当然我也调试过，在内存中看过数据，不理解。

user: user-4
content: http://edu.csdn.net/course/detail/2455/38534

user: user-0
content: 引用 21 楼 ipqtjmqj 的回复:[quote=引用 19 楼 NotSimpleEasy 的回复:] [quote=引用 18 楼 ipqtjmqj 的回复:] [quote=引用 17 楼 NotSimpleEasy 的回复:] [quote=引用 16 楼 ipqtjmqj 的回复:] [quote=引用 8 楼 qq423399099 的回复:] 值是一样的，但性质以及含义是不同的。 数组名代表数组中第一个元素的地址，数组名取地址代表整个数组的地址。 不要误导别人，数组名代表的当然是数组本身了，你sizeof(a),返回的是20。 只是数组的地址与数组第1个元素的地址一样罢了，以及数组传参时会隐式转换（为了效率）[/quote] 不知道我这个问题怎么解释。。我蒙了。。[/quote] 你写个程序sizeof(a)返回20，就可以确认数组名代表的是整个数组，而不是什么地址[/quote]  那输出a和输出&a一样么？搞得我好晕。。[/quote] 传入a相当于传了&a[0],我前面说过了，这是隐式转换，因为传参是复制，数组天然的空间复杂度是O(n), 所以规定自动改传第1个元素的地址了。 &a[0]与&a的值一样，好比，你海拔1米8，那么你的头发海拔也是1米8[/quote] 多谢耐心讲解，我理解理解。。

user: user-4
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-5
content: 引用 19 楼 NotSimpleEasy 的回复:[quote=引用 18 楼 ipqtjmqj 的回复:] [quote=引用 17 楼 NotSimpleEasy 的回复:] [quote=引用 16 楼 ipqtjmqj 的回复:] [quote=引用 8 楼 qq423399099 的回复:] 值是一样的，但性质以及含义是不同的。 数组名代表数组中第一个元素的地址，数组名取地址代表整个数组的地址。 不要误导别人，数组名代表的当然是数组本身了，你sizeof(a),返回的是20。 只是数组的地址与数组第1个元素的地址一样罢了，以及数组传参时会隐式转换（为了效率）[/quote] 不知道我这个问题怎么解释。。我蒙了。。[/quote] 你写个程序sizeof(a)返回20，就可以确认数组名代表的是整个数组，而不是什么地址[/quote]  那输出a和输出&a一样么？搞得我好晕。。[/quote] 传入a相当于传了&a[0],我前面说过了，这是隐式转换，因为传参是复制，数组天然的空间复杂度是O(n), 所以规定自动改传第1个元素的地址了。 &a[0]与&a的值一样，好比，你海拔1米8，那么你的头发海拔也是1米8

user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495 赵四老师能否给学生讲解一下。。。

user: user-0
content: 引用 18 楼 ipqtjmqj 的回复:[quote=引用 17 楼 NotSimpleEasy 的回复:] [quote=引用 16 楼 ipqtjmqj 的回复:] [quote=引用 8 楼 qq423399099 的回复:] 值是一样的，但性质以及含义是不同的。 数组名代表数组中第一个元素的地址，数组名取地址代表整个数组的地址。 不要误导别人，数组名代表的当然是数组本身了，你sizeof(a),返回的是20。 只是数组的地址与数组第1个元素的地址一样罢了，以及数组传参时会隐式转换（为了效率）[/quote] 不知道我这个问题怎么解释。。我蒙了。。[/quote] 你写个程序sizeof(a)返回20，就可以确认数组名代表的是整个数组，而不是什么地址[/quote]  那输出a和输出&a一样么？搞得我好晕。。

user: user-5
content: 引用 17 楼 NotSimpleEasy 的回复:[quote=引用 16 楼 ipqtjmqj 的回复:] [quote=引用 8 楼 qq423399099 的回复:] 值是一样的，但性质以及含义是不同的。 数组名代表数组中第一个元素的地址，数组名取地址代表整个数组的地址。 不要误导别人，数组名代表的当然是数组本身了，你sizeof(a),返回的是20。 只是数组的地址与数组第1个元素的地址一样罢了，以及数组传参时会隐式转换（为了效率）[/quote] 不知道我这个问题怎么解释。。我蒙了。。[/quote] 你写个程序sizeof(a)返回20，就可以确认数组名代表的是整个数组，而不是什么地址

user: user-0
content: 引用 16 楼 ipqtjmqj 的回复:[quote=引用 8 楼 qq423399099 的回复:] 值是一样的，但性质以及含义是不同的。 数组名代表数组中第一个元素的地址，数组名取地址代表整个数组的地址。 不要误导别人，数组名代表的当然是数组本身了，你sizeof(a),返回的是20。 只是数组的地址与数组第1个元素的地址一样罢了，以及数组传参时会隐式转换（为了效率）[/quote] 不知道我这个问题怎么解释。。我蒙了。。

user: user-5
content: 引用 8 楼 qq423399099 的回复:值是一样的，但性质以及含义是不同的。 数组名代表数组中第一个元素的地址，数组名取地址代表整个数组的地址。 不要误导别人，数组名代表的当然是数组本身了，你sizeof(a),返回的是20。 只是数组的地址与数组第1个元素的地址一样罢了，以及数组传参时会隐式转换（为了效率）

user: user-0
content: 引用 14 楼 ipqtjmqj 的回复:[quote=引用 11 楼 ipqtjmqj 的回复:] a与a[0]地址一样，值不一样,也就是你说的加了取地址符就一样了 在你的例子中，a的值00,00,00,01,00,00,00,02,00,00,00,03,00,00,00,04,00,00,00,05 a[0]的值是00,00,00,01(16进制，逗号分隔每个字节) 失误，int一般是小端，所以a的值是01,00,00,00,02,00,00,00,03,00,00,00,04,00,00,00,05,00,00,00  a[0]的值是01,00,00,00[/quote]

user: user-5
content: 引用 11 楼 ipqtjmqj 的回复:a与a[0]地址一样，值不一样,也就是你说的加了取地址符就一样了 在你的例子中，a的值00,00,00,01,00,00,00,02,00,00,00,03,00,00,00,04,00,00,00,05 a[0]的值是00,00,00,01(16进制，逗号分隔每个字节) 失误，int一般是小端，所以a的值是01,00,00,00,02,00,00,00,03,00,00,00,04,00,00,00,05,00,00,00  a[0]的值是01,00,00,00

user: user-4
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-6
content: 是不是一样，编译器已经给你答案了。 你打印一下他们+1以后的地址，你就看出区别来了。（代表的含义不同）