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

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

java中直接给字符串赋值常量 java给字符串变量赋值_c++ 指针

1

今日主题

java中直接给字符串赋值常量 java给字符串变量赋值_c++ 指针_02

有以下代码:

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

实践演练

java中直接给字符串赋值常量 java给字符串变量赋值_c++ 指针_02

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

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

知识裂变

java中直接给字符串赋值常量 java给字符串变量赋值_c++ 指针_02


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虽然也有地址,但是和指针有所不同。

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