一个C语言指针变量和指针的区别编程问题,求大佬解答?

C语言中printf函数中%s是什么意思

C语言中printf函数中%s表示按照字符串的方式输出,s表示string
printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。
格式输出,它是c语言中产生格式化输出的函数(在 stdio.h 中定义)。用于向终端(显示器、控制台等)输出字符。格式控制由要输出的文字和数据格式说明组成。要输出的的文字除了可以使用字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义。
比如%d表示符号型的int,%u表示无符号的int,%f表示浮点型的数据

C语言中,printf函数如何处理%s?

这一类符号是“格式说明”,用于格式的输入与格式的输出,就是当printf和scanf函数中在输入输出时,对不同类型的数据(如int,float,char等)要使用不同的格式来进行说明。 %d,用来输出十进制整数。 %f,用来输出实数(包括单,双精度),以小数形式输出,默认情况下保留小数点6位。 %c,用来输出一个字符。 %s,用来输出一个字符串。 扩展资料: 格式说明由“%”和格式字符组成,如%d%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。 格式字符有d,o,x,u,c,s,f,e,g等。 如%d整型输出,%ld长整型输出,%o以八进制数形式输出整数,%x以十六进制数形式输出整数,或输出字符串的地址。 %u以十进制数输出unsigned型数据(无符号数)。注意:%d与%u有无符号的数值范围,也就是极限的值,不然数值打印出来会有误。 %.100f用来输出实数,保留小数点100位。 %e以指数形式输出实数。 %g根据大小自动选f格式或e格式,且不输出无意义的零。

请问c语言中,printf函数里面的%s,%c中带"*","."分别是什么意思啊?后面的参数如何设置

C语言中%c,%s分别代表什么意思?

却决于在scanf中使用还是在printf中使用
如果在scanf中使用,则添加了*的部分会被忽略,不会被参数获取
在printf中使用,则代表带*的%s由之后的参数决定输出字符串的最小字符宽度

C语言中printf函数中%s是什么意思


%c在C语言中代表字符型格式符。 %s在C语言中代表字符串型格式符。 %c和%s一般用在printf、sprintf等字符串格式化函数中,用于决定格式化参数的数据类型。如printf("%s", a)会将变量a作为字符串类型进行格式化。 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。 printf()函数的调用格式为: printf("", )。 扩展资料: C语言的格式输出中,%c,%s这些代表要输出的数据的数据类型,例如: %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %0 无符号以八进制表示的整数 %g 自动选择合适的表示法 参考资料来源:百度百科-printf

c语言中 %s 是什么意思?

%s是一种字符串的输出格式说明符,输出字符串。



这一类符号是“格式说明”,用于格式的输入与格式的输出,就是当printf和scanf函数中在输入输出时,对不同类型的数据(如int,float,char等)要使用不同的格式来进行说明。 %d,用来输出十进制整数。 %f,用来输出实数(包括单,双精度),以小数形式输出,默认情况下保留小数点6位。 %c,用来输出一个字符。 %s,用来输出一个字符串。 扩展资料: 格式说明由“%”和格式字符组成,如%d%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。 格式字符有d,o,x,u,c,s,f,e,g等。 如%d整型输出,%ld长整型输出,%o以八进制数形式输出整数,%x以十六进制数形式输出整数,或输出字符串的地址。 %u以十进制数输出unsigned型数据(无符号数)。注意:%d与%u有无符号的数值范围,也就是极限的值,不然数值打印出来会有误。 %.100f用来输出实数,保留小数点100位。 %e以指数形式输出实数。 %g根据大小自动选f格式或e格式,且不输出无意义的零。

c语言中%s是什么意思


%s是一种字符串的输出格式说明符,输出字符串。

%s需要配合printf函数一起使用,如下所示:printf("%s", "adfds"); // 输出字符串adfds 拓展资料:C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。 二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。

%s在C语言中什么意思


c语言中%c与%s的有什么区别?

c语言中%c格式符表示输出的是字符 ,%s格式符表示输出的是字符串。 C语言基本构成: 1.数据类型 C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。 2.常量与变量 常量其值不可改变,符号常量名通常用大写。 变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成的序列,请注意第一个字符必须为字母或下划线,否则为不合法的变量名。变量在编译时为其分配相应存储单元。 3.数组 如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。字符串也是一种数组。它们以ASCII的NULL作为数组的结束。要特别注意的是,方括内的索引值是从0算起的。 4.指针 如果一个变量声明时在前面使用 * 号,表明这是个指针型变量。换句话说,该变量存储一个地址,而 *(此处特指单目运算符 * ,下同。C语言中另有 双目运算符 *) 则是取内容操作符,意思是取这个内存地址里存储的内容。指针是 C 语言区别于其他同时代高级语言的主要特征之一。 指针不仅可以是变量的地址,还可以是数组、数组元素、函数的地址。通过指针作为形式参数可以在函数的调用过程得到一个以上的返回值,不同于return(z)这样的仅能得到一个返回值。 指针是一把双刃剑,许多操作可以通过指针自然的表达,但是不正确的或者过分的使用指针又会给程序带来大量潜在的错误。 5.字符串 C语言的字符串其实就是以'\0'字符结尾的char型数组,使用字符型并不需要引用库,但是使用字符串就需要C标准库里面的一些用于对字符串进行操作的函数。它们不同于字符数组。使用这些函数需要引用头文件。 6.文件输入/输出 在C语言中,输入和输出是经由标准库中的一组函数来实现的。在ANSI C中,这些函数被定义在头文件;中。 7.标准输入/输出 有三个标准输入/输出是标准I/O库预先定义的:

C语言中%c,%s分别代表什么意思?

ChengJie!。在这里强调一下,这两个符号也叫占位符。也属于输入输出控制符。如果说这两个符号用错了,则会造成无法输出或输出乱码的情况。同类的还有很多。望多多学习和掌握。 1.%u 十进制无符号整数 2.%f 浮点数 3.%s 字符串 4.%c 单个字符 5.%p 指针的值 6.%e 指数形式的浮点数 7.%x, %X 无符号以十六进制表示的整数 8.%0 无符号以八进制表示的整数 9.%g 自动选择合适的表示法

C语言中%c,%s分别代表什么意思?


%c在C语言中代表字符型格式符。 %s在C语言中代表字符串型格式符。 %c和%s一般用在printf、sprintf等字符串格式化函数中,用于决定格式化参数的数据类型。如printf("%s", a)会将变量a作为字符串类型进行格式化。 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。 printf()函数的调用格式为: printf("", )。 格式输出,它是c语言中产生格式化输出的函数(在 stdio.h 中定义)。用于向终端(显示器、控制台等)输出字符。格式控制由要输出的文字和数据格式说明组成。要输出的文字除了可以使用字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义。 扩展资料: C语言中所有格式化类型的定义: 1、%d/i 接受整数值并将它表示为有符号的十进制整数,i是老式写法 2、%o 无符号8进制整数(不输出前缀0) 3、%u 无符号10进制整数 4、%x/X 无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF(不输出前缀0x) 5、%f(lf) 单精度浮点数和双精度浮点数用f(lf在C99开始加入标准,意思和f相同) 6、%e/E 科学计数法表示的数,此处"e"的大小写代表在输出时用的“e”的大小写 7、%g/G 有效位数,如:%.8g表示单精度浮点数保留8位有效数字。 8、%c 字符型。可以把输入的数字按照ASCII码相应转换为对应的字符 9、%s/S 字符串。输出字符串中的字符直至字符串中的空字符(字符串以'\0‘结尾,这个'\0'即空字符) 10、%p 以16进制形式输出指针 11、%n 到此字符之前为止,一共输出的字符个数,不输出文本 12、%% 不进行转换,输出字符‘%’(百分号)本身

C语言中scanf的%s是什么意思,%c和%s有什么区别。会的进来,谢谢.


%s是字符串的输入,不读到空格或空行就不会停止,而%d是整型变量,输入的时候只会读到一个整型变量,然后到空格停止,%c只能读一个字符型变量,读到之后就停止。


从键盘拍入的内容,在 “键盘缓冲区”,当拍了 Enter 键(平时喊它回车键)时,键盘 缓冲区 的内容 才被 送到 “输入缓冲区”。

scanf() 读数时 是到 “输入缓冲区” 取数,“输入缓冲区” 没内容 时,scanf() 等待。

scanf("%c",a+i) 这种格式,它在缓冲区 取单个字符,空格键也好,tab 键也好, Enter 键, 字母键也好,数字键也好,遇到什么 取什么。并不跳过 “空白”
所以,输入缓冲区 有 a白b白c白d回车时,它读入的 4 个 字符 是: a 白 b 白
反序 输出 就 没有 得到 预期要 的 结果。

如果 用 scanf(" %c",a+i) 输入格式,它会自动 以空白 为 输入数据 分隔符,
拍入 a白b白c白d回车时,它会得到 abcd 。
这样 你 反序 输出 也能 得到 预期 的 结果。


scanf()函数是标准C中提供的标准输入函数,用以用户输入数据
scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。
scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:
//例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()读到10个字节char buf[5]={'\0'};scanf("%s", buf);//如果输入,则5以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常。以上代码如果用scanf_s()则可避免此问题:
PS: 很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。



c语言中%c与%s的区别


%c格式对应的是单个字符,%s格式对应的是字符串。 1.%c格式对应的是单个字符。所以在输入多个字符的时候,它只会读取第一个字符,之后的字符是无法读入完成任务的,那么也就是说,只进行一次读取工作的C函数表达方式。 2.%S格式对应的是字符串。S通常表示复数,也是多个的意思,那么在字符中表示字符串。

c语言中%c和%s的区别

%c格式对应的是单个字符。
所以在输入多个字符的时候,它只会读取第一个字符,之后的字符是无法读入完成任务的,那么也就是说,只进行一次读取工作的C函数表达方式。
%C只能输入一个字符。
如果是正确的输入Y,如果是错误的输入N。
%S格式对应的是字符串。
S通常表示复数,也是多个的意思,那么在字符中表示字符串。
关于%S可以输入一串字符的字符串。
字符的个数是通过字符串来进行设定的。


c语言中,%c和%s在输入和输出字符串的时候有什么区别?


输入: 1、赋值 %c输入函数只会对一个字节空间赋值,而%s会一直赋值,直到输入中遇到空白字符为止。 2、地址符 输入的时候scanf("%c", &a);这里的&不能少,而scanf("%s",s);这里不能有&符号。 输出: 1、长度 %c只能输出一个字符,%s输出的是一串字符,直到某一个字节内存的元素为字符'\0'时,输出此字符并且寻址结束。 扩展资料 转换说明符 1、%a(%A):浮点数、十六进制数字和p-(P-)记数法(C99) 2、%c:字符 3、%d:有符号十进制整数 4、%f:浮点数(包括float和doulbe) 5、%e(%E):浮点数指数输出[e-(E-)记数法] 6、%g(%G):浮点数不显无意义的零"0" 7、%i:有符号十进制整数(与%d相同) 8、%u:无符号十进制整数 9、%o八进制整数 10、%x(%X):十六进制整数0f(0F) 11、%p:指针 12、%s:字符串 13、%%:"%" 格式字符串 语法:〔标志〕〔输出最少宽度〕〔.精度〕〔长度〕类型 "%-md" : 左对齐,若m比实际少时,按实际输出。 "%m.ns" : 输出m位,取字符串(左起)n位,左补空格,当n>m or m省略时m=n "%m.nf" : 输出浮点数,m为宽度,n为小数点右边数位

C语言作为编程的入门语言,学习者如何快速掌握其核心知识点,面对茫茫书海,似乎有点迷茫。为了让各位快速地掌握C语言的知识内容,在这里对相关的知识点进行了归纳。

笔者有十余年的C++开发经验,相比而言,我的C经验只有一两年,C比较简单,简单到《The C Programming Language》(C程序设计语言)只有区区的200多页,相比上千页的C++大部头,不得不说真的很人性化了。

C语言精简的语法集和标准库,让我们可以把精力集中到设计等真正重要的事情上来,而不是迷失在语法的海洋里,这对于初学者尤其重要。虽然C语言有抽象不足的缺点,但我更喜欢它的精巧,只需要花少量的时间,研究清楚它每一个知识点,看任何C源码就不会存在语法上的障碍,大家需要建立的知识共识足够少,少即是多,少好于多。

我教过6个人编程,教过HTML,教过JAVA,也教过C++。最近,我在教我小孩编程,他只有十岁,很多人建议我选择Python,但我最终选择了C语言,因为C语言简单且强大,现在看来,好像是个不错的选择。

struct、union、enum属于c的构造类型,用于自定义类型,扩充类型系统。

变量用来保存数据,数据是操作的对象,变量的变字意味着它可以在运行时被修改。

变量由类型名+变量名决定,定义变量需要为变量分配内存,可以在定义变量的同时做初始化。

运行中恒定、不可变,编译期便可确定。

光有简单变量显然不够,我们需要数组,它模拟现实中相同类型的多个元素,这些对象是紧密相邻的,通过数组名+位置索引便能访问每个元素。

二维、三维、高纬数组本质上还是线性的,二维数组通过模拟行列给人平面的感觉,实际存储上还是连续内存的方式。

数组是静态的,在定义的时候,数组的长度就已经确认,运行中无法伸缩,所以有时候我们不得不为应付扩充多分配一些空间。数组元素不管用多用少,它都在哪里,有时候,我们会用一个int n去界定数组实际被使用的元素个数。

函数封装行为,是模块化的最小单元,函数使得逻辑复用变得可能。

C语言是过程式的,现实世界都可以封装为一个个过程(函数),通过过程串联和编排模拟世界。

用C语言编程,行为和数据是分离的。调用函数的时候,调用者通过参数向函数传递信息,函数通过返回值向调用者反馈结果。

函数最好是无副作用的,函数内应该尽量避免修改全局变量或者静态局部变量,更好的方式是通过参数传递进来,这样的函数只是逻辑的盒子,它满足线程安全的要求。

有了变量和函数,就可以编写简单的程序了。

build-in数据类型不足以描绘现实世界,或者用build-in类型描述不够直接,结构体用来模拟复合类型,它赋予了我们扩充类型系统的能力,我们把类型组合到一起构建更复杂的类型,而每个被组合的成分就叫成员变量。

结构体内的成分,对象通过点(.)运算符,指针通过箭头(->)访问成员。

C语言的灵魂是指针,指针带来弹性,指针的本质是地址。

需要区分指针和指针指向的对象,多个指针变量可指向同一个对象,一个指针不能同时指向多个对象。

指针相关的基本操作包括:赋值(修改指针指向),解引用(访问指针指向的对象),取地址(&variable),指针支持加减运算。

因为指针变量要能覆盖整个内存空间,所以指针变量的长度等于字长,32位系统下32位4字节,64位系统下64位8字节。

既可以定义指向build-in数据类型的指针,也可以定义指向struct的指针,void*表示通用(万能)指针,它不能被解引用,也不能做指针算术运算。

c source code被编译链接后,函数被转换到可执行程序文件的text节,进程启动的时候,会把text节的内容装载到进程的代码段,代码段是c进程内存空间的一部分,所以任何c函数都会占一块内存空间,函数指针就是指向函数在代码段的第一行汇编指令,函数调用就会跳转到函数的第一个指令处执行。

函数指针经常被用来作为回调(callback),c语言也会用包含函数指针成员的结构体模拟OOP,本质上是把C++编译器做的事情,转给程序员来做(C++为包含虚函数的类构建虚函数表,为包含虚函数的类对象附加虚函数表的指针)。

char*是一类特殊的指针,它被称为c风格字符串,因为它总是以‘\0’作为结尾的标识,所以要标识一个字符串,有一个char*指针就够了,字符串的长度被0隐式指出,跟字符串相关的STD C API大多以str打头,比如strlen/strcpy/strcat/strcmp/strtok。

指针提供了c语言直接操作底层内存的能力,c程序区分栈内存和堆内存,栈内存是函数内的局部变量,它随程序执行而动态伸缩,所以不要返回临时变量的指针,栈内存容量有限(8/16M),所以我们要避免在函数内创建过大的局部变量,要警惕递归爆栈。

堆内存也叫动态内存,它由一个叫动态内存配置器的标准库组件管理,glibc的默认动态内存配置器叫ptmalloc,初始版本有性能问题,但后面用线程私有解决了竞争改善了性能。动态内存配置器是介于kernel与应用层的一个层次,从内核视角看ptmalloc是应用程序,从应用层来看ptmalloc又是系统库。malloc跟free必须配对,这是程序员的职责,动态分配的内存丢失引用就会导致内存泄漏,指向已释放的内存块俗称野(悬垂)指针。

从c source file到可执行程序需要经过预处理-编译-汇编-链接多个阶段,预处理阶段做替换、消除和扩充,预处理语句以#打头。

宏定义,#define,宏定义可以用\做行连接,#用来产生字符串,##用来拼接,宏定义的时候要注意加()避免操作符优先级干扰,可以用do while(0)来把定义作为单独语句,#undef是define的反操作。

#include用来做头文件包含;#pragma用来做行为控制;#error用来在编译的时候输出错误信息。

typedef也能用来为结构体取别名,有时候会这样写:

这样在定义结构体变量的时候就可以少敲几下键盘。

枚举能增加代码可读性和可维护性,枚举本质上是int,只是为了更有含义,将有限取值的几个int值放在一组,比如定义性别:enum sex { male = 1, female };

可以在定义的时候赋值,比如male=1,后面的值依次递增1,如果不赋值则从0开始。

结构体和联合体(共用体)的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

其实本质上,联合体就是对一块内存的多种解释,大小按最大的来。

节省空间,在面向底层的编码,或者编写处理网络等程序时候用的比较多,注意这个语法特征是跟机器架构相关的。

(1)static修饰全局函数,表示模块内(编译单元)内可用,不需要导出全局符号。

(2)static修饰局部变量,意味超越函数调用的生命周期,不存储在栈上,只会被初始化1次。

(3)extern声明外部变量。

(4)register,寄存器变量,建议编译器将变量放在寄存器里。

(5)volatile,告诉编译器不要做优化,每次从内存读取,不做寄存器优化。

(6)sizeof求大小,可以作用于变量,类型,表达式

泛型:linux内核链表,通过offset和内嵌node,写出泛型链表。

OOP:通过定义带函数指针成员变量的结构体,在运行中,为结构体对象设置上函数指针,模拟运行时绑定,实现类似OOP多态的感觉。

GNU C扩展不是标准C,建议以符合标准C的方式编写C代码,但如果你阅读linux kernel code,你会发现有很多有趣看不懂的语法,它来自GNU C扩展,它确实也带来了一些便利性。

比如结构体成员可以不按定义顺序初始化:

比如可以通过指定索引初始化数组:

比如表达式扩展({...}),比如三元运算符扩展...

学习C/C++编程知识,提升C/C++编程能力,欢迎关注UP一起来成长!
另外,UP在主页上传了一些学习,有兴趣或者正在学习的小伙伴一定要去看一看哦!会对你有帮助的~

  指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的效率。有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组的处理更方便,使程序的书写简洁,高效,清爽。但由于指针对初学者来说,难于理解和掌握,需要一定的计算机硬件的知识做基础,这就需要多做多练,多上机动手,才能在实践中尽快掌握,成为C的高手。

  过去,我们在编程中定义或说明变量,编译系统就为已定义的变量分配相应的内存单元,也就是说,每个变量在内存会有固定的位置,有具体的地址。由于变量的数据类型不同,它所占的内存单元数也不相同。若我们在程序中做定义为

  让我们先看一下编译系统是怎样为变量分配内存的。变量a,b是整型变量,在内存各占2个字节;x,y是实型,各占4个字节;m是双精度实型,占8个字节;ch1,ch2是字符型,各占1个字节。由于计算机内存是按字节编址的,设变量的存放从内存2000单元开始存放,则编译系统对变量在内存的安放情况为图6-1所示。

  变量在内存中按照数据类型的不同,占内存的大小也不同,都有具体的内存单元地址,如变量a在内存的地址是2000,占据两个字节后,变量b的内存地址就为2002,变量m的内存地址为2012等。对内存中变量的访问,过去用scanf("%d%d%f",&a,&b,&x)表示将数据输入变量的地址所指示的内存单元。那么,访问变量,首先应找到其在内存的地址,或者说,一个地址唯一指向一个内存变量,我们称这个地址为变量的指针。如果将变量的地址保存在内存的特定区域,用变量来存放这些地址,这样的变量就是指针变量,通过指针对所指向变量的访问,也就是一种对变量的“间接访问”。

  设一组指针变量pa、pb、px、py、pm、pch1、pch2,分别指向上述的变量a、b、x、y、m、ch1、ch2,指针变量也同样被存放在内存,二者的关系如图6-2所示

  在图6-2中,左部所示的内存存放了指针变量的值,该值给出的是所指变量的地址,通过该地址,就可以对右部描述的变量进行访问。如指针变量pa的值为2000,是变量a在内存的地址。因此,pa就指向变量a。变量的地址就是指针,存放指针的变量就是指针变量。

我要回帖

更多关于 指针变量和指针的区别 的文章

 

随机推荐