c新手问一个数组指针的问题

leopard231325 2018-03-09 03:50:04
int a[3];
cout<<a<<" "<<&a<<endl;

以上的输出相同(都为数组首地址), 为什么呢?

我的理解是:
a 代表数组的首地址, 即 a===&a[0];
&a 不应该是代表数组首地址的地址?

...全文
1165 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
仙剑老祖 2018-03-22
  • 打赏
  • 举报
回复
C语言规定数组的名字就是数组的首地址; 不要纠结这种问题
AlbertS 2018-03-22
  • 打赏
  • 举报
回复
引用 3 楼 yangbomoto 的回复:
#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;

int main(){

	int a[3] = { 1,2,3 };
	cout << sizeof(int) << endl;
	cout << "a: " << a <<endl;
	cout << "a+1: " << a + 1 << endl;
	cout << "&a: " << &a << endl;
	cout << "&a+1: " << &a + 1 << endl;


    cout<<"Hello....."<<endl;
    system("pause");
    return 0;
}
由此可值,a代表的是数组的首地址,a+1向后跳int的字节,&a代表的是指向这真个数组(其值也是数组首地址),&a+1向后跳整个数组所占的字节。
+1
赵4老师 2018-03-16
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组
自信男孩 2018-03-16
  • 打赏
  • 举报
回复
引用 7 楼 qq_24947841 的回复:
[quote=引用 1 楼 cfjtaishan 的回复:] 类型不同,a是int *类型(数组可以理解为指针常量),但是&a是int **类型。 因此:a + 1和&a + 1代表的长度不一样:a + 1表示基于a向后偏移sizeof(int)个字节,但是&a + 1是表示基于a向后偏移3 * sizeof(int)个字节。
类型是不同 但&a应该是 int (*)[3]类型[/quote] 对
lyflyf1999 2018-03-15
  • 打赏
  • 举报
回复
&a是整个数组的首地址,a是数组首元素的首地址
考拉一枚 2018-03-15
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
类型不同,a是int *类型(数组可以理解为指针常量),但是&a是int **类型。 因此:a + 1和&a + 1代表的长度不一样:a + 1表示基于a向后偏移sizeof(int)个字节,但是&a + 1是表示基于a向后偏移3 * sizeof(int)个字节。
类型是不同 但&a应该是 int (*)[3]类型
weixin_41842829 2018-03-15
  • 打赏
  • 举报
回复
int a[3] a 表示 &a[0] 这个没错,是首地址 &a 表示 int (*) [3] 这个,是一个指针指向有3个元素的结构 a 和 &a 的结构大小不回 a 是 int &a 是 int (*)[3]
leopard231325 2018-03-12
  • 打赏
  • 举报
回复
谢谢大神们的指教。
  • 打赏
  • 举报
回复
a是数组 第一个元素 的地址,与&a[0] 一样; &a是 数组 的 首地址。 取一个数组名的地址(&a)所产生的是一个指向 数组 的指针,跟a(一个指向a[0]的指针)在指针的类型上是有区别的。
嘿碳头 2018-03-09
  • 打赏
  • 举报
回复
#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;

int main(){

int a[3] = { 1,2,3 };
cout << sizeof(int) << endl;
cout << "a: " << a <<endl;
cout << "a+1: " << a + 1 << endl;
cout << "&a: " << &a << endl;
cout << "&a+1: " << &a + 1 << endl;


cout<<"Hello....."<<endl;
system("pause");
return 0;
}


由此可值,a代表的是数组的首地址,a+1向后跳int的字节,&a代表的是指向这真个数组(其值也是数组首地址),&a+1向后跳整个数组所占的字节。
赵4老师 2018-03-09
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→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 http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
自信男孩 2018-03-09
  • 打赏
  • 举报
回复
类型不同,a是int *类型(数组可以理解为指针常量),但是&a是int **类型。 因此:a + 1和&a + 1代表的长度不一样:a + 1表示基于a向后偏移sizeof(int)个字节,但是&a + 1是表示基于a向后偏移3 * sizeof(int)个字节。
里面都是我新手时期学C的时候整理的一些TXT文档,因为分不够了,所以放上来赚点积分,都是很基础的东西,里面的代码都是经过我测试的,保证可用。 (1)输出Hello,world (2)标识符 (3)常量与变量 (4)整型数据 (5)实型数据 (6)复合赋值表达式 (7)自加自减运算符和逗号表达式 (8)顺序结构及数据输出 (9)数据输入 (10)作业练习一 (11)关系运算符和逻辑运算符 (12)选择结构及条件表达式 (13)循环结构,while语句 (14)循环结构,do while语句 (15)循环结构,for语句 (16)字符型数据 (17)字符型数据实例,作业练习二 (18)函数定义 (19)函数应用实例,作业练习三 (20)指针的定义 (21)函数之间地址值的传递 (22)函数返回地址值 (23)一维数组的定义 (24)一维数组应用实例 (25)一维数组应用实例(2) (26)一维数组应用实例(3) (27)二维数组的定义 (28)二维数组的初始化 (29)二维数组指针 (30)二维数组应用实例 (31)二维数组应用实例(2) (32)用一维数组来存储字符串 (33)字符串的输入与输出 (34)字符串数组 (35)用于字符串处理的函数 (36)字符串应用实例 (37)传给Main函数的参数 (38)函数指针 (39)函数的递归调用 (40)变量作用域和存储类别 (41)编译预处理和不带参数的宏替换 (42)带参数的宏替换和文件包含 (43)动态存储分配 (44)结构体变量的定义与引用 (45)利用结构体变量构成静态链表 (46)利用结构体变量构成动态链表 (47)共用体的定义与应用 (48)位运算符 (49)File文件的数据输出操作 (50)File文件的数据输入操作 (51)判断文件结束函数 (52)fscanf和fprintf函数 (53)fgets和fputs函数 (54)fread和fwrite函数 (55)文件定位函数 c switch的用法 c 避免调试窗口闪退 c 弹出消息窗口 c 等待函数(sleep) c 定义类成员 c 动态分配内存法定义数组 c 返回二维数组 c 方向键键码 c 改变字体颜色 c 绘制图形 c 获得鼠标当前位置坐标 c 检测键盘按键 c 检测鼠标按下事件 c 将整数转换成二进制数并存放到数组中 c 结构体 c 使用winsock实现server和client(通讯程序) c 随机数发生器 c 图形模式详解 c 网页爬虫 c 写图形界面 c 遗传算法实例 c 在图形界面输出文字 c# List的用法 VS2010如何解决每次编译都要重新生成

69,371

社区成员

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

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