特别设置【每日一问】专栏,对专业课--C/C++的复习的学习成果进行实践检验以及知识拓展,裂变自己接触和学习过的知识及技巧;主要是理论和实践相结合,以基础知识为主,实践操作为辅,保证学习效果,和大家一起回顾知识,共同进步,加油!
特别提示:【每日一问】栏目包括但不限于【今日主题】、【实践演练】、【知识裂变】等模块,内容比较基础,适合新手学习以及熟手进行知识回顾,大神勿喷,请自动绕道,谢谢!
1
今日主题
有以下代码:
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
实践演练
为什么不能将字符赋值给字符指针变量,可以将字符串赋值给指针变量呢?
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
知识裂变
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虽然也有地址,但是和指针有所不同。
指针的值是地址,而数组的值虽然也是地址,但是却是一个常量,所以不能给常量赋值。