为什么C语言Scanf函数对字符串不要加 取地址运算符&

如题所述

C语言的字符串为数组形式,而数组的名称可以表示其地址,故对字符串输入不需要加地址符。而单独的字符、整型变量等的名称不能直接表示地址,故需要加地址符。

数据类型

字符串数据类型是建模在形式字符串的想法上的数据类型。字符串是几乎在所有编程语言中可以实现的非常重要和有用的数据类型。

在某些语言中它们可作为基本类型获得,在另一些语言中做为复合类型获得。多数高级语言的语法允许通常用某种方式引用起来的字符串来表示字符串数据类型的实例;这种元字符串叫做“文本”或“字符串文本”。

扩展资料

字符串

C语言的字符串其实就是以'\0'字符结尾的char型数组,使用字符型并不需要引用库,但是使用字符串就需要C标准库里面的一些用于对字符串进行操作的函数。它们不同于字符数组。使用这些函数需要引用头文件<string.h>。

文件输入/输出

在C语言中,输入和输出是经由标准库中的一组函数来实现的。在ANSI C中,这些函数被定义在头文件<stdio.h>;中。

标准输入/输出

有三个标准输入/输出是标准I/O库预先定义的:

1、stdin标准输入

2、stdout标准输出

3、stderr输入输出错误

参考资料来源:百度百科-字符串

参考资料来源:百度百科-c语言

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-06-26

字符串名字就代表字符串的首地址,因此不需要加&。

字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,如s=“abcdefghij”,则s[1]=“b”,s[9]="j",而字符串的零位正是它的长度,如s[0]=10。

在程序设计中,字符串(string)为符号或数值的一个连续序列,如符号串(一串字符)或二进制数字串(一串二进制数字)。

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

依据数组初始化规则,可以把上面的语句写成以下语句:

char greeting[] = "Hello";

扩展资料:

函数应用

1. 连接运算 concat(s1,s2,s3…sn) 相当于s1+s2+s3+…+sn。

例:concat(‘11’,'aa’)='11aa’;

2. 求子串。 Copy(s,I,I) 从字符串s中截取第I个字符开始后的长度为l的子串。

例:copy(‘abdag’,2,3)=’bda’;

3. 删除子串。过程 Delete(s,I,l) 从字符串s中删除第I个字符开始后的长度为l的子串。

例:s:=’abcde’;delete(s,2,3);结果s:=’ae’;

4. 插入子串。 过程Insert(s1,s2,I) 把s1插入到s2的第I个位置。

例:s:=abc;insert(‘12’,s,2);结果s:=’a12bc’;

5. 求字符串长度 length(s) 例:length(‘12abc’)=5。

在ASP中 求字符串长度用 len(s)例: len("abc12")=5。

参考资料:

百度百科-字符串

本回答被网友采纳
第2个回答  2013-02-08
C语言的字符串实际上是 字符数组.
既然是数组, 那么数组头自然是一个指针.
char str[] = {"abc"};
这个str实际上是一个不可变的字符指针.
scanf的参数要求传入指针. 之后按照格式化字符串对指针指向的地址赋值..
str本身就是一个指针了, 所以不需要&str,
如果&str, 那么得到是就是指针的指针,

scanf并不只是对字符串不加 取地址运算符.
例如 int arr[] = {1, 2, 3};
scanf("%d", arr);
这里对arr照样不需要取地址运算符, 因为arr是数组头, 本身就是一个指针.
上面的语句是对arr数组的第一个元素赋值, 就是arr[0];

当然也可以这么写.
scanf("%d", &arr[0]);
arr[0]是一个值, 并非指针, 于是对其取地址.

对于字符串也可以这么写.
char str[3] ;
scanf("%c", &str[0]);
这是对str的第一个元素赋值也就是 str[0];

不知道你看懂了没有?本回答被提问者采纳
第3个回答  2013-02-08
C的输入函数是scanf而非Scanf。
C没有字符串变量,字符串是用字符数组处理的。数组的特点是数组名有双重身份:既是数组名又是这个字符串第一个字符的地址,也就是这个字符串的首地址。所以当有char a[10]的声明后,scanf("%s",a)和scanf("%s",&a)都是合法的,前者a是指针身份,后者a是数组名身份;无论早期的C还是现在的C都是认可的。本回答被网友采纳
第4个回答  2020-09-11
关注
C语言的字符串为数组形式,而数组的名称可以表示其地址,故对字符串输入不需要加地址符。而单独的字符、整型变量等的名称不能直接表示地址,故需要加地址符。

数据类型

字符串数据类型是建模在形式字符串的想法上的数据类型。字符串是几乎在所有编程语言中可以实现的非常重要和有用的数据类型。

在某些语言中它们可作为基本类型获得,在另一些语言中做为复合类型获得。多数高级语言的语法允许通常用某种方式引用起来的字符串来表示字符串数据类型的实例;这种元字符串叫做“文本”或“字符串文本”。

扩展资料

字符串

C语言的字符串其实就是以'\0'字符结尾的char型数组,使用字符型并不需要引用库,但是使用字符串就需要C标准库里面的一些用于对字符串进行操作的函数。它们不同于字符数组。使用这些函数需要引用头文件<string.h>。

文件输入/输出

在C语言中,输入和输出是经由标准库中的一组函数来实现的。在ANSI C中,这些函数被定义在头文件<stdio.h>;中。

标准输入/输出

有三个标准输入/输出是标准I/O库预先定义的:

1、stdin标准输入

2、stdout标准输出

3、stderr输入输出错误

参考资料来源:百度百科-字符串

参考资料来源:百度百科-c语言

0 7

iiiiiiiipl
2019-06-26

关注
字符串名字就代表字符串的首地址,因此不需要加&。

字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,如s=“abcdefghij”,则s[1]=“b”,s[9]="j",而字符串的零位正是它的长度,如s[0]=10。

在程序设计中,字符串(string)为符号或数值的一个连续序列,如符号串(一串字符)或二进制数字串(一串二进制数字)。

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

依据数组初始化规则,可以把上面的语句写成以下语句:

char greeting[] = "Hello";

扩展资料:

函数应用

1. 连接运算 concat(s1,s2,s3…sn) 相当于s1+s2+s3+…+sn。

例:concat(‘11’,'aa’)='11aa’;

2. 求子串。 Copy(s,I,I) 从字符串s中截取第I个字符开始后的长度为l的子串。

例:copy(‘abdag’,2,3)=’bda’;

3. 删除子串。过程 Delete(s,I,l) 从字符串s中删除第I个字符开始后的长度为l的子串。

例:s:=’abcde’;delete(s,2,3);结果s:=’ae’;

4. 插入子串。 过程Insert(s1,s2,I) 把s1插入到s2的第I个位置。

例:s:=abc;insert(‘12’,s,2);结果s:=’a12bc’;

5. 求字符串长度 length(s) 例:length(‘12abc’)=5。

在ASP中 求字符串长度用 len(s)例: len("abc12")=5。

参考资料:

百度百科-字符串

0 1

匿名用户
2020-09-08

python编程入门,科大讯飞资深讲师线上授课,拥有多年实战经验。从入门到实战进阶课程限时免费,还有更多免费课程java,机器学习等就在讯飞AI大学 点击进入详情页
广告

White_MouseYBZ
2013-02-08

关注
C的输入函数是scanf而非Scanf。
C没有字符串变量,字符串是用字符数组处理的。数组的特点是数组名有双重身份:既是数组名又是这个字符串第一个字符的地址,也就是这个字符串的首地址。所以当有char a[10]的声明后,scanf("%s",a)和scanf("%s",&a)都是合法的,前者a是指针身份,后者a是数组名身份;无论早期的C还是现在的C都是认可的。
2 123

OverSeven
2013-02-08

关注
因为字符串 名本身就是一个指针。 如: char a[100]; a就是指针,指向数组首地址。
而 int a; a 是整形变量,要用scanf来读取数据放入 内存, 要访问内存区域,要通过地址来访问
所以要加上&, 通过&a来访问内存区域。
0 6

落单毛毛虫
2013-02-08

关注
C语言的字符串实际上是 字符数组.
既然是数组, 那么数组头自然是一个指针.
char str[] = {"abc"};
这个str实际上是一个不可变的字符指针.
scanf的参数要求传入指针. 之后按照格式化字符串对指针指向的地址赋值..
str本身就是一个指针了, 所以不需要&str,
如果&str, 那么得到是就是指针的指针,
scanf并不只是对字符串不加 取地址运算符.
例如 int arr[] = {1, 2, 3};
scanf("%d", arr);
这里对arr照样不需要取地址运算符, 因为arr是数组头, 本身就是一个指针.
上面的语句是对arr数组的第一个元素赋值, 就是arr[0];
当然也可以这么写.
scanf("%d", &arr[0]);
arr[0]是一个值, 并非指针, 于是对其取地址.
对于字符串也可以这么写.
char str[3] ;
scanf("%c", &str[0]);
这是对str的第一个元素赋值也就是 str[0];
不知道你看懂了没有?
1 赞赏 191
完成点赞任务,奖励10财富值

加入战队答题,平均奖励翻1.5倍

赚财富值

stelika
2013-02-08

关注
因为scanf要获取变量的地址才能把读到的内容存放在这个变量里
你说的字符串是c风格字符串,c风格字符串变量本身就是这个字符串的首地址,所以无需加&
1 6

l521088816
2013-02-08

关注
字符串的变量名称就是这个字符串的首地址了
既然已经是地址了,就不用再取地址了
0 1

匿名用户
2013-02-08

因为字符串 char *str:本身就是指针变量
0 3

非常老L
2013-02-08

关注
编译器认为字符串代表地址。
0 3
python编程入门学习_免费视频教程_从入门到实战。
关注编程的都在看
python编程入门,科大讯飞资深讲师线上授课,拥有多年实战经验。从入门到实战进阶课..
科大讯飞股份有限公司广告
.c语言培训,0基础学游戏U3D,月薪高
根据文中提到的c语言为您推荐
火星学习c语言培训,游戏U3D编程师就业薪资高,毕业=高薪就业,0基础学习,半年即可..
北京火星时代科技有限公司广告
编程-学完就业!
关注编程的都在看
武汉北大青鸟编程入学签就业协议,,免费试读
武汉宏鹏职业培训学校广告

百度APP
有事搜一搜 没事看一看
立即下载
为您推荐
C语言中 用scanf函数输入字符串数组,取地址符&是不用输的,如果输了取地址符算错么 ,或者含义不一样么?
不一样。 C语言的字符串为数组形式,而数组的名称可以表示其地址,故对字符串输入不需要加地址符。而单独

5 浏览4453

c语言中为什么printf输出变量值的时候不要加地址符&,而scanf中却要加上
这是因为使用C语言定义的标准函数,c语言开发时就这么规定的,没有太多的为什么(当初开发C语言的时候也

9 浏览3026

c语言 scanf();为什么要用取地址符
因为scanf这个函数要求的参数传递的是地址!! 函数原型: int scanf(const cha

95 浏览6129

为何在C语言中的scanf()中要用到取地址符,而printf()中却不用?
真正有兴趣的话,可以看看能否找到printf和scanf的源码实现,这样就清楚了。

2 浏览2852

为什么在C语言中,用scanf输入字符串时,不需加&
因为字符串变量名在 scanf 语句里 表示指针 (地址) 例如: char s[80]; s

69 浏览8205 2017-11-22
scanf函数

什么是scanf函数,它在程序中有什么作用

57个问题1,465,886人浏览

龙族神途电脑版_20全新版本
m.99st.com广告
编程-武汉北大青鸟宏鹏校区!
最近2小时前有人咨询相关问题
点击咨询了解更多详情
咨询
m.whhpaccp.com广告
正在加载
向网友提问
十分钟内有问必答
立即下载
董升dig__的知道 退出 反馈 申诉
电脑版 ©2020 Baidu

京ICP证030173号-1 京网文【2013】0934-983号