13、C语言中的单引号和双引号

本文主要介绍C语言中,单引号表示字符字面量,编译为ASCII码;双引号表示字符串字面量,编译为内存地址。还通过程序实例分析了使用中的问题,如字符串用字符存储会截断,一般用指针指向字符串,同时提到低地址空间不能随意访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

—— C语言中的单引号用来表示字符字面量,编译为对应的ASCII码
—— C语言中的双引号用来表示字符串字面量,编译为对应的内存地址

‘a’表示字符字面量,在内存中占一个字节,‘a’+1表示‘a’的ASCII码加1,结果为‘b’。
“a”表示字符串字面量,在内存中占两个字节,“a”+1表示指针运算,结果指向“a”结束符‘\0’

分析:下面这段程序合法吗?

char* p1 = 1;          // p1指向地址0x00000001
char* p2 = '1';        // p2指向地址0x00000031
char* p3 = "1";        // p3指向地址0x080484d0

这三条语句是合法的,会出现警告,但是本质上并没有影响程序的运行
如果程序改成这样:

#include <stdio.h>
int main()
{
	char* p1 = 1;
	char* p2 = '1';
	char* p3 = "1";

	printf("%s,%s,%s\n", p1, p2, p3);   //出现段错误
	
	printf('\n');                       //出现段错误
	printf("\n");
	return 0;
}

小贴士:
1、字符字面量被编译为对应的ASCII码
2、字符串字面量被编译为对应的内存地址
3、内存的低地址空间不能在程序中随意访问

在这里插入图片描述
右上图可知,所有低于0x08048000的地址空间都不能访问,所以p1和p2都不能访问内存地址,会出现段错误·。
在这里插入图片描述
程序实例分析:

char c = “string”;

其实这个明显是错误的,因为字符串会编译为对应的内存地址,内存地址占4个字节,但是c只占一个字节,会产生截断,所以一般对于字符串,我们用指针来指向

char* p= “string”;
### C语言单引号双引号的区别 在C语言编程环境中,单引号双引号用于定义不同类型的字符串或字符常量。具体来说: #### 单引号 `'` 的用途 单引号用来表示字符型数据,即字符常量。一个由单引号括起来的字符会被解释成其对应的ASCII码值或其他编码系统的整数值[^3]。 例如: ```c char ch = 'A'; ``` 这里 `ch` 存储的是字母 A 对应的 ASCII 值 65 而不是实际的文字“A”。 如果尝试打印这个变量,则会显示相应的字符而不是数字形式的ASCII码: ```c printf("%c", ch); // 输出: A ``` 当对字符执行算术运算时,实际上是对其内部存储的数值进行操作。比如 `'a' + 1` 将得到下一个字符 `'b'` 的ASCII码值[^2]。 #### 双引号 `"` 的用途 双引号则被用来创建字符串字面量,也就是一串连续的多个字符组成的数组,并自动在其末尾加上终止符 `\0` 来标记字符串结束位置。这意味着即使只包含一个字符,“X”也会占用两个字节的空间(假设使用8位字符),因为还需要额外的一字节来保存零结尾标志[^1]。 考虑下面的例子: ```c const char *str = "B"; ``` 这里的指针 `str` 指向了一个含有两个元素的字符数组:第一个是大写字母 B (ASCII 66),第二个是空字符 '\0'。 #### 错误示范与修正建议 给定代码片段存在一些错误之处: ```c #include <stdio.h> int main() { char* p1 = 1; char* p2 = '1'; char* p3 = "1"; printf("%s, %s, %s\n", p1, p2, p3); return 0; } ``` 上述程序试图将不同类型的数据赋值给指向字符 (`char`) 类型对象的指针,这可能导致未定义行为。更正后的版本如下所示: ```c #include <stdio.h> int main(void){ const char c1 = 1; // 整形转为字符 const char c2 = '1'; // 字符常量 const char str[] = "1"; // 字符串 printf("'%c', '%c', \"%s\"\n", c1, c2, str); return 0; } ``` 在这个例子中,`c1`, `c2` `str` 都能正确地传递给 `printf()` 函数并按照预期的方式输出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值