为何数组名的地址和给数组名求地址得到的地址结果是一样的啊

zjtzlqr 2014-11-08 04:52:59
// basic_string_get_allocator.cpp
// compile with: /EHsc
#include <string>
#include <iostream>
#include "stdio.h"

int main( )
{
int a[2] = {0};
printf("%p\n",a);//代表的是数组首元素的地址
printf("%p\n",&a);
}

003AF730
003AF730
请按任意键继续. . .
...全文
260 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2014-12-03
  • 打赏
  • 举报
回复
樓上又複製粘貼混分
赵4老师 2014-12-03
  • 打赏
  • 举报
回复
引用 10 楼 SXJIAKE 的回复:
樓上又複製粘貼混分
闲着也是闲着,活动活动手指。
赵4老师 2014-11-11
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 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
  • 打赏
  • 举报
回复
a的首地址,a指针的地址。表示的字节数不一样,操作的时候操作的字节数也不一样
Lion_Peng 2014-11-11
  • 打赏
  • 举报
回复
a和&a在数值上都一样,但表示的意义不一样。a表示的是首元素地址,而&a表示的这片内存区域首地址。两者的区别之一是a+1和&a+1的结果不一样(计算时的步长不一样)。
ForestDB 2014-11-10
  • 打赏
  • 举报
回复
地址内容一样,指向的含义不同。 a指向的是其第0个元素,即a[0]。 而&a指向的是a,即int[2]。
li4c 2014-11-09
  • 打赏
  • 举报
回复
《c专家编程》
fengzhw 2014-11-09
  • 打赏
  • 举报
回复
那就是语义上的差别,不是值上的差别了。 《C和指针》 8章专门讲了数组和指针的各种关系,一定要认真读。
TJF331311545 2014-11-08
  • 打赏
  • 举报
回复
引用 1 楼 u013163178 的回复:
数值一样而已,含义不一眼,各自+1再比较你几知道有什么区别了。
++
707wk 2014-11-08
  • 打赏
  • 举报
回复
坐等赵老师回复
li4c 2014-11-08
  • 打赏
  • 举报
回复
数值一样而已,含义不一眼,各自+1再比较你几知道有什么区别了。
第九章 数组 9.1 理解数组 C语言数组是一个由若干同类型数据组成的集合,数组由连续的存储单元组成,最低地址对应于数组的第一个元素,最高地址对应于最后一个元素。 9.2 一维数组 9.2.1 一维数组定义 定义形式: 类型说明符 数组[常量表达式] 类型说明符是任一种基本数据类型或构造数据类型。数组是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度,数组中每个成员称为数组元素。 对于数组的说明: (1)类型说明符实际上是指数组元素的类型。 (2)数组实际上就是第一个元素的地址,是一个常量。 (3)方括号中常量表达式表示数组元素的个数,可以是符号常量。因为数组和一般变量的空间在编译阶段分配,而变量的值在运行时才获得,编译时并不知道变量的值,因此不能用变量定义数组的大小。 (4)数组占用空间大小的计算,可以用sizeof运算符。数组总字节数=sizeof(类型说明符)*数组长度=sizeof(数组)。 9.2.2 一维数组引用 数组元素的的标识方法为数组后跟下标。引用数组元素的一般形式为:数组[下标]。下标只能为整型常量、整型变量、整型表达式。 每个数组元素和变量一样,可以进行读写、输入输出操作等。 数组定义的方括号中给出的是数组长度,只能是常量。数组元素引用中的下标是元素在数组中位置的标识,可以是整型常量、整型变量、整型表达式。 注意: (1)使用具有N个元素的数组时,引用下标为0~N-1,第一个元素为数组[0],最后一个元素为数组[N-1]。数组代表起始地址,下标代表从起始地址开始偏移几个元素,第一个元素偏移0,第N个元素偏移N-1,下标为N-1。 (2)引用数组元素下标越界时,运行并不报错(因为检查是否越界占用系统时间,C语言崇尚高效),但越界使用可能破坏其他数据。 (3)C语言中只能单个的使用下标标识每个数组元素。 用循环语句输入、输出数组元素的值: int iArr[5]; for(i=0;i<5;i++) scanf("%d",&iArr;); for(i=0;i<5;i++) printf("%d",iArr[i]); 对元素分别赋值1,2,3,4,5 int iArr[5]; for(i=0;i<5;i++) iArr[i]=i+1; (4)数组定义后若不给元素赋值,则值由编译器指定无意义的数据。 9.2.3 一维数组初始化 给数组赋值有两种方法:赋值语句对数组元素逐个赋值,初始化赋值。初始化赋值指在数组定义时给数组元素赋予初值。 数组初始化是在编译阶段进行的,可以减少运行时间,提高效率。 初始化赋值的形式: 类型说明符 数组[常量表达式]={值1,值2,···,值n}; 对数组初始化赋值的说明: (1)可以只给部分元素赋初值,当{}中值的个数少于元素个数时,只给前面部分元素赋初值,未赋值的元素会赋予与数组元素类型相关的特定值,整型为0,浮点型为0.0,字符型为'\0'。 补充说明:字符'0'和'\0'区别: 字符'0':ASCII码为48,内存中存放表示:00110000。 字符'\0' :ASCII码为0,表示一个字符串结束的标志。这是转义字符(整体视为一个字符)。由于内存中存储字符,存储的是对应字符集的字符编码,所以内存中的表现形式为00000000。 (2)只能给元素逐个赋值。如给5个元素全部赋初值1,要写成: int iA[5]={1,1,1,1,1}; (3)如果给元素全部赋值,可以不给出数组长度(即数组元素的个数)。 9.2.4 一维数组案例分析 例:把一个整数插入到已经按照从小到大顺序排好序的整型数组中,使得整型数组依然有序。 【问题分析】

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧