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

供稿:hz-xin.com     日期:2025-01-13
C语言中 用scanf函数输入字符串数组,取地址符&是不用输的,如果输了取地址符算错么 ,或者含义不一样么?

不一样。
C语言的字符串为数组形式,而数组的名称可以表示其地址,故对字符串输入不需要加地址符。而单独的字符、整型变量等的名称不能直接表示地址,故需要加地址符。数组名就代表了该数组的地址。整个数组是一块连续的内存单元,数组名所代表的地址为第0个元素的地址,c就代表c[0]的地址。
设数组c的首地址为0X2000,也就是说c[0]地址为0X2000,则数组名c就代表这个首地址。因为c已经表示地址,所以在c前面不能再加取地址符&。

字符串数据类型是建模在形式字符串的想法上的数据类型。字符串是几乎在所有编程语言中可以实现的非常重要和有用的数据类型。
扩展资料
为了避免这种情况,可多设几个字符数组分段存放含空格的串。程序可改写如下:
#include
intmain()
{
char str1[20], str2[20], str3[20];
printf("Input string: ");
scanf("%s %s %s %s",str1,str2, str3);
printf("Your string: %s %s %s %s
",str1, str2, str3);
}
运行结果:
Input string: C C++ Java
Your string: C C++ Java

scanf(“格式控制字符串”, 地址表列);
其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。

例如:&a、&b分别表示变量a和变量b的地址。

这个地址就是编译系统在内存中给a、b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它语言不同的。 应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。

变量的地址和变量值的关系
在赋值表达式中给变量赋值,如:
a=567;
则,a为变量名,567是变量的值,&a是变量a的地址。

但在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。

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

数据类型

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

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

扩展资料

字符串

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

文件输入/输出

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

标准输入/输出

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

1、stdin标准输入

2、stdout标准输出

3、stderr输入输出错误

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

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



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

字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,如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。

参考资料:

百度百科-字符串



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];

不知道你看懂了没有?

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

关注
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号

c语言编程中,如何用scanf函数输出字符数组?
一、题目大意为输出一个已知的字符串。解题思路:定义一个字符数组,并用“初始化列表”对其赋以初值 用循环逐个输出此字符数组中的字符 include <stdio.h> int main(){ char c[15]={'r',' ','i','g',' ','g',' ','h','t','u',};int i;for(i=0;i<15;i++)printf("A=%...

scanf函数是什么意思?
`scanf` 是C语言中的一个标准库函数,用于从标准输入(通常是键盘)读取格式化输入。它的原型定义在 `<stdio.h>` 头文件中。int scanf(const char *format, ...);- `format` 参数是一个格式控制字符串,指定了要读取的输入的类型和格式。比如 `%d` 表示读取一个整数,`%f` 表示读取一个浮点...

scanf什么时候用??c语言
对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。 (7)在输入流中,数据项必须由空格、制表符和新行符分割。逗号和分号等不是分隔符,比如以下代码: scanf( "%d %d", &r, &c ); 将接受输入 10 20,但遇到 10,20 则失败。 (...

scanf在c语言中代表什么
scanf是一个在C语言中广泛使用的输入函数,它用于从键盘读取数据并将其存储到指定的变量中。scanf函数的工作原理如下:1、首先,调用scanf函数时,会读取键盘上的第一个字符,直到遇到空白字符(如空格、制表符、换行符等)。2、然后,scanf函数会根据格式化字符串中的第一个格式指示符识别输入数据的类型...

Scanf()函数的使用
scanf()函数是一个用于从标准输入读取数据的C语言函数,其函数原型为:int scanf(char *format[,argument,...]);其中,“格式控制”的含义与printf函数相同,用于指定输入数据的格式。而“地址表列”则是一系列地址组成的列表,可以是变量的地址或字符串的首地址。当使用scanf()函数读取数据时,它会...

scanf是什么函数?
scanf是C语言中的标准输入函数。函数原型:int scanf( const char *format, ... );其调用格式为: scanf("<格式化字符串>",<地址表>);&是取地址scanf读取变量的时候,参数需要的是变量的实际内存地址,了解C语言指针的概念后就4102会明白地址就是指针,指向变量的数据内容。

scanf%s是什么意思?
scanf%s是什么意思?scanf函数是C语言中的一个输入函数,在需要输入字符串的时候常会用到。其中%s是scanf函数的一个转换字符,用于读入字符串。当scanf函数遇到%s转换字符时,它将读取输入缓冲区中的一个字符串,并将它存储到指定的变量中,直到遇到空格、制表符或换行符为止。例如,使用scanf函数读取一个...

c语言中如何输入输出字符串
在C语言中,输入输出字符串有以下两种方式:1 用scanf\/printf输入输出。scanf\/printf是C语言的格式化输入输出函数,可以用于输入输出各种基础类型,字符串(char*)也 其支持范围内。格式化字符为%s。定义 char str[100];输入 scanf("%s",str);输出 printf("%s",str);2 C语言还支持专门的字符串输入...

C语言 scanf中“%*c”什么意思???
scanf的主要功能是从键盘接收用户输入,并根据指定格式将输入的数据存储到相应的变量中。这个函数的灵活性在于它能够处理多种数据类型,包括整数、浮点数、字符和字符串等。它通过一个格式字符串来定义输入的数据格式,例如,%d表示整数,%f表示浮点数,%s表示字符串,而%c用于读取单个字符。在使用scanf时,...

scanf函数是什么意思?
scanf是C语言中的一个输入函数,用于从标准输入流(通常是键盘)读取数据。scanf函数的基本语法是:scanf(format-string, arguments);其中,format-string是一个包含格式控制符的字符串,用于指定要读取的数据类型和格式。arguments是一个包含要读取的数据项的列表。例如,以下代码从键盘读取一个整数:在这个...