c++ 字符串_C/C++每日一问为什么字符串可以赋值给字符指针变量?

本文详细解析了C/C++中字符指针的使用,包括为何不能将字符直接赋值给字符指针变量,而可以将字符串赋值给字符指针变量的原因,并通过实例解释了单引号和双引号的区别。

b81f567fba4584f225579937d989e86c.png

C/C++每日一问

c93c7267051a9b2e6d0a190f06b86823.png

点击上方「嵌入式龙憨憨」,选择「置顶/星标公众号」第一时间查看编程笔记!

ffb3684e1439a656068e1a7fe9efd8b5.png

特别设置【每日一问】专栏,对专业课--C/C++的复习的学习成果进行实践检验以及知识拓展,裂变自己接触和学习过的知识及技巧;主要是理论和实践相结合,以基础知识为主,实践操作为辅,保证学习效果,和大家一起回顾知识,共同进步,加油!

特别提示:【每日一问】栏目包括但不限于【今日主题】、【实践演练】、【知识裂变】等模块,内容比较基础,适合新手学习以及熟手进行知识回顾,大神勿喷,请自动绕道,谢谢!

20cbbefdad71866b1a1b7c2377c1d5ac.png

1

今日主题

cee02b5f7124d5df33a334177bb393fe.png

有以下代码:

typedef char* PCHAR;PCHAR p1 = 'a';// 1PCHAR p2 = "Hello";// 2PCHAR p3;char name[5] = "John";p3 = name;// 3

1、2、3条语句是否合法?

语句1不合法,语句2和3均合法。

由上可知,不能将字符赋值给字符指针变量,可以将字符串赋值给指针变量。为什么呢?

2

实践演练

cee02b5f7124d5df33a334177bb393fe.png

为什么不能将字符赋值给字符指针变量,可以将字符串赋值给指针变量呢?

1、单引号和双引号

1.1简介

C语言中的单引号用来表示字符字面量 

C语言中的双引号用来表示字符串字面量

如:

'a'表示字符字面量 ,在内存中占1个字节 

'a'+1表示'a'的ASCII码加1, 结果为'b'
"a"表示字符串字面量 ,在内存中占2个字节 

"a"+1表示指针运算,结果指向"a"结束符'\0'

1.2数据长度

单引号:单引号的数据长度固定,因为只有一个字符,所以数据长度为1。

双引号:双引号的数据长度不固定由字符串的字符数量决定

2、具体分析

PCHAR p1 = 'a';// 1

单引号中的一个字符实际上代表一个整数,'a'对应ASCII码的97,所以将一个整数赋值给指针变量初始化是不对的,指针变量需要用地址进行初始化

语句1可以改写为以下代码,就是正确的。

char c = 'a';PCHAR p1 = &c;// 1
PCHAR p2 = "Hello";// 2

语句2,"Hello"表达式使用的值就是这些字符所存储的地址(在常量区),而不是这些字符本身。

双引号做了3件事:  

  • 1.申请了空间(在常量区),存放了字符串 

  • 2. 在字符串尾加上了'/0'    

  • 3.返回首字符地址

这里将返回的地址赋值给了p2,所以可以用字符串赋值给字符指针变量。

3、小结

单引号中的单个字符为字符字面量,被编译为对应的ASCII码,代表整数;

双引号中的字符为字符串字面量,被编译为对应的内存地址,代表字符指针(即地址)

所以可以用字符串对字符指针变量进行初始化赋值。

3

知识裂变

cee02b5f7124d5df33a334177bb393fe.png

1、typedef 关键字

1.1作用:

为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。

在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

typedef char* PCHAR;

PCHAR定义为char*的别名,看到PCHAR就相当于char*;

2、语句3中的知识点

CHAR p3;char name[5] = "John";p3 = name;// 3

语句3先对数组name用字符串初始化,name是数组名,代表数组的首地址,所以是可以赋值给字符指针变量的。

但是如果换种写法:

char name[5]name = "John";

经典的错误,绝对的零分!

“John”赋的值是一个地址,而name虽然也有地址,但是和指针有所不同。

指针的值是地址,而数组的值虽然也是地址,但是却是一个常量,所以不能给常量赋值。

长按图片关注079a27e040460c42ee20b1f6a1eedd54.png

63fd12fcf8ae67ff321d001f5991957f.png

分享技术,码字不易

转发、在看就是我最大的动力

置顶/星标公众号,和我一起学习吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值