scanf("%s",name);字符串数组输入带不带取地址符的问题

sunflower_25 2017-12-20 08:35:55
定义了字符串数组char name[20];
我们都知道通过如下方式读入用户输入:scanf("%s",name);
但发现scanf("%s",&name);也能接收到用户输入。
通过printf("%p %p\n",name, &name) 可以看到两个地址值都是相同的,
但通过 printf("%p %p\n",name+1, (&name)+1); 发现两个还是存在差异的。

请高手解答name 与&name 差异。感谢。
...全文
4774 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
六道佩恩 2018-09-25
  • 打赏
  • 举报
回复 2
scanf读取的时候只看传过来的值,这两个参数在数值上是一样的,因此scanf能正确读写。但本质上name和&name是不一样的,数组名在运算时会转换成指针,所以name是指向第一个元素的指针,name+1则指向第二个元素,&name是整个数组的首地址,&name+1指向数组的后面
_肆 2018-08-22
  • 打赏
  • 举报
回复
你这个并不是name和&name的区别,而是你对name+1、&name+1、(&name)+1三者的理解

第一个,name和&name一样,都代表数组的首地址,或者name[0]的地址,所以name+1代表name[1]的地址,注意&(name+1)的写法是错的,因为name+1已经表示地址了,再对地址取地址就是**了,但是&name里,name表示的是数组,是可以这么写的

二和三一样,表示下一个name[20]的首地址,+1的出现改变了&name原因的意义,同理+2就是下下个char数组的首地址

但是在指针里又不一样,比如如果是char *name;name+1表示指向name[1]的值, &name+1、(&name)+1表示name[1]的地址,而一个地址是四字节,所以是&name的值+4
Jacky_Lu 2018-08-22
  • 打赏
  • 举报
回复
学习了 &数组 就是数组指针了 的确也是
macslaytion 2018-08-22
  • 打赏
  • 举报
回复
name在字符串中本就是该字符串的首地址,而不是int类型的,若加上&取址,就是把地址取了两次了
李财日记 2018-08-16
  • 打赏
  • 举报
回复 1
数组名可以被当作指针,好理解,但数组名并不是指针
&加数组名,那么这个得到的地址是整个数组的地址
不加 & ,那么这个地址是数组首元素的地址
int a[10];
p = a; //p指向 a 数组的首元素 p+1 指向数组的第二个元素。p只指向一个int类型
p = &a; //p之指向a整个数组,p+1指向a[10] 越界。p指向10个int类型
  • 打赏
  • 举报
回复
都可以啊,标准应该是要有的,但是c语言提供了方便程序员操作的方式,不加也可以
codedoctor 2018-03-04
  • 打赏
  • 举报
回复
比如有一个二维数组 char[20][20], 现在让name=& char[0][0]; 此时name 指向二维数组数组char[0][0]的首地址,是一个字符指针(指向二维数组的列数,name+1等于前进一列) &name 指向装有若干个数组的数组的第一个数组的地址(指向一个二维的行数,&name+1等于换行)
考拉一枚 2018-03-02
  • 打赏
  • 举报
回复
name &name 都是地址,地址内容相同,即整个数组的首地址,数组第一个元素的首地址,但地址类型不同 一个 指向char,一个指向char数组 ,故做地址加1运算时偏移量为sizeof(type)*1
迷茫的咖啡 2018-02-26
  • 打赏
  • 举报
回复
引用 4 楼 kuangbao9 的回复:
[quote=引用 3 楼 sunflower_25 的回复:] [quote=引用 1 楼 kuangbao9 的回复:] 我瞎猜一下:首先name本身是数组的首地址, 而&name是整个数组的地址,所以理论上name和&name地址是一样的,都是指向数组首地址。 其次,name + 1表示的是数组第二个元素的地址,而(&name)+1表示的是数组最后一个元素的地址的下一个地址。
我试验name地址是FF20,但(&name)+1却是FF34。对于name是一个20个字节的数组。[/quote] FF34这不正好是最后一个元素地址的下一个地址嘛。。。。[/quot] 地址是十六进制表示的
chf_1 2018-01-28
  • 打赏
  • 举报
回复
字符串数组不带&,如name[10];输入字符串就是scanf(“%d”,name); 因为数组名name本身就是数组的地址;
赵4老师 2017-12-22
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察
//char (*(*x[3])())[5];//x是什么类型的变量?
//
//分析C语言声明,关键是搞清楚这个变量是个什么东西(函数、指针、数组),
//是函数那么剩下的就是他的参数和返回值,
//是指针那剩下部分是说明他指向什么,
//是数组剩下的部分就是说明数组的成员是什么类型。
//解析C语言声明规则:
//从左侧第一个标识符开始,按照优先级进行结合。*表示是..的指针,const表示只读的,volatile表示可变的,[]表示是数组,()表示是函数。
//
//x和[3]结合说明是一个大小为3的数组,该数组的每个元素为一类指针,该类指针指向一类函数,该类函数无参数,返回一类指针,该类指针指向一个大小为5的char型数组
#include <stdio.h>
#include <typeinfo.h>
char num[5];
char (*x00())[5] {
    return #
}
int main() {
    char (*(*x[3])())[5];//是个数组,大小为3
    char (*(*x0  )())[5];//数组的元素,是个函数指针
    char (*( x00 )())[5];//函数原型,参数为空,返回值为指针
    char (*  x000   )[5];//返回值

    x0 = x00;
    x[0] = x0;
    x[1] = x0;
    x[2] = x0;
    printf("typeid(x).name() is %s\n",typeid(x).name());
    return 0;
}
//typeid(x).name() is char (* (__cdecl**)(void))[5]
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
AlbertS 2017-12-20
  • 打赏
  • 举报
回复
引用 5 楼 paschen 的回复:
正确的是使用name,name和&name仅仅只是地址相同,但他们是完全不同的类型,前者数组退化后的char*类型,后者是指向数组的指针,这也是为什么他们+1后的值不一样的原因,前者+1移动一个字符,后者则移动一个数组大小的长度
很详细,其实读取字符串一般不加地址符,数组名表示首地址
paschen 2017-12-20
  • 打赏
  • 举报
回复
正确的是使用name,name和&name仅仅只是地址相同,但他们是完全不同的类型,前者数组退化后的char*类型,后者是指向数组的指针,这也是为什么他们+1后的值不一样的原因,前者+1移动一个字符,后者则移动一个数组大小的长度
kuangbao9 2017-12-20
  • 打赏
  • 举报
回复
引用 3 楼 sunflower_25 的回复:
[quote=引用 1 楼 kuangbao9 的回复:] 我瞎猜一下:首先name本身是数组的首地址, 而&name是整个数组的地址,所以理论上name和&name地址是一样的,都是指向数组首地址。 其次,name + 1表示的是数组第二个元素的地址,而(&name)+1表示的是数组最后一个元素的地址的下一个地址。
我试验name地址是FF20,但(&name)+1却是FF34。对于name是一个20个字节的数组。[/quote] FF34这不正好是最后一个元素地址的下一个地址嘛。。。。
sunflower_25 2017-12-20
  • 打赏
  • 举报
回复
引用 1 楼 kuangbao9 的回复:
我瞎猜一下:首先name本身是数组的首地址, 而&name是整个数组的地址,所以理论上name和&name地址是一样的,都是指向数组首地址。 其次,name + 1表示的是数组第二个元素的地址,而(&name)+1表示的是数组最后一个元素的地址的下一个地址。
我试验name地址是FF20,但(&name)+1却是FF34。对于name是一个20个字节的数组。
自信男孩 2017-12-20
  • 打赏
  • 举报
回复
地址是一样的,但是类型是不一样的。name是数组名,可以理解位指针常量,是属于一维指针,而&name是属于二维指针。那么&name相当于name的地址,即&name + 1相当于偏移sizeof(name)个字节。而name + 1偏移是1个字节。
kuangbao9 2017-12-20
  • 打赏
  • 举报
回复
我瞎猜一下:首先name本身是数组的首地址, 而&name是整个数组的地址,所以理论上name和&name地址是一样的,都是指向数组首地址。 其次,name + 1表示的是数组第二个元素的地址,而(&name)+1表示的是数组最后一个元素的地址的下一个地址。
内容概要:本文档围绕基于H桥级联五电平逆变器的三相LCL滤波器SPWM调制技术,利用MATLAB/Simulink平台开展系统建模与仿真分析,深入探讨多电平逆变器的调制策略、LCL滤波器的设计方法及其在电力电子系统中的应用。文档不仅聚焦于核心仿真模型的构建与性能验证,还系统整理了大量相关科研资源,涵盖VSG控制、双机并联、下垂控制、无功优化、储能配置、微电网调度等多个前沿方向,展示了MATLAB/Simulink在电力系统、新能源控制、信号处理及智能优化等领域的广泛应用。同时强调科研过程中逻辑思维、创新意识与借助优质仿真资源的重要性,倡导“借力”提升科研效率。; 适合人群:电力电子、电气工程、自动化、新能源系统及相关专业的研究生、科研人员及从事电力电子与微电网仿真的工程技术人员。; 使用场景及目标:①开展多电平逆变器与LCL滤波器的仿真设计及性能优化研究;②深入掌握SPWM调制技术及其在逆变系统中的实现机制;③复现高水平论文中的控制策略与仿真模型,支撑科研项目或论文写作;④结合提供的网盘资源快速获主流研究方向的Matlab/Simulink代码与模型,加速科研进程。; 其他说明:所有仿真资源可通过关注公众号“荔枝科研社”并访问指定百度网盘链接免费获,建议读者系统学习文档内容并结合自身研究课题进行实践与创新,充分发挥资源的参考价值与实用价值。

70,038

社区成员

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

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