180111—【字符】字符变量、字符数组以及它和指针乱七八糟的关系。

字符变量

赋值:
首先需要明白,char型变量存放的是一个ASCII码值,是个数,但又不是个数。啥意思呢?
我们都知道在程序里给一个char变量赋值的话,以下写法是教科书级的:

char a=‘c’; //定义了一个char型变量a,它的值表示小写字母“c”。

但由其实质出发的话,我们可以发现,这里的赋值可以不写成‘ c’这样的形式:
这里写图片描述
上述代码中,变量b的赋值是直接用了数字,即ASCII码值,可以见到,b的值是个括号。查码值表可以发现“{”的值是123。
而对于c,其实char型变量的含义是“字符型变量”,这就意味着他不止可以存字母啊,各类符号都可以存啊~
既然存字母需要单引号,那存数字也要有单引号啊~
那为什么123变成3了?
其实这个语句系统会报警告:

[Warning] overflow in implicit constant conversion [-Woverflow]
[警告]隐式常数溢出
[Warning] multi-character character constant [-Wmultichar]
[警告]多字符常量

实测发现,放一位数是没问题的,位数再多就会如此,数据溢出了,所以只读到了最后一位的3(不是大小的事,写00也会报)
这个错误其实在赋字母的时候也会出现:

char a='ab';    //a存住的东西只有b

综上,在代码中为char型数据赋值基本上是在“论单引号的哲学意义和三重根”。。
好了不扯,
那么如果写成输入语句,在黑框里输入内容又会如何呢?

你感觉呢?

当然直接输就行了啊。当然不用输单引号啊,不然是不是太不人道了点?
至于它的输出,无甚可谈。

下面是重头戏啦~:

字符数组,以及指针。。

“C++没有把字符串作为基本类型,字符串常量是用双引号相括的字符序列,以数组形式存放。”
先讲数组:
首先,字符数组有如下几种初始化方式。

1.通过大括号,逐个字符对数组元素赋初始值:
    char b[]={'s','t'};
    char c[10]={'s','t'}; 

上述两种表示体现出char数组依旧具备之前刚接触存int数据的数组时的初始化特性。

2.可以使用串常量初始化:
char a[]={"student"};
char a[]="student";

上述两种表达都是一种原理。且这样的初始化方式只能在定义字符数组之处使用,如果先定义。后赋值,则将报错:

[Error] invalid conversion from 'const char*' to 'char' [-fpermissive]
[错误]无效的 常字符指针(也就是字符串)转换为字符。
3.黑框输入:

其实很多时候我们需要这样的功能,其实现也很简单。定义一个长度足够的字符数组,然后将输入语句写成:

char s[100];
cin>>s;  //直接写名字就好。

这里只整理简单用法,至于为了获得空格需要的输入函数暂且不涉及。

4.作为函数待传值参数:

使用字符串拷贝函数即可轻松做到。

#include<iostream>
#include<cstring>
using namespace std;
void a(char*num) //数组名和地址和指针的绕口令我就不念了。。
{
    char a_num[20];
    strcpy(a_num,num);
    cout<<a_num;
}
int main()
{
    a("dasdasf");  //这部分代码实现需要指针的相关知识,后面会讲
 } 
关于输出:

对于一个int类型的数组,如果现在讨论它的输出的话,怕是要被人笑死。。
要是char型数组也这么单纯该多么好。。可惜不是。
这里写图片描述

  • 就像写输入语句的时候写个首地址 a 就好了,输出的时候也可以用这招。(其实应该说:就该用这招,别整些花里胡哨的。而所谓花里胡哨的是指:你当然可以像输出普通数组所有元素一样写个for循环!
  • 如果是写成 *a 用之前学数组时的知识分析,a即为a[0]的地址,加星号实现了间址访问。所以只输出第一项。(如果想单独输出某个字母的话可以用这招。)就像写成 a[0] 一般。
  • 其实我之前也没想过取地址的地址会发生什么。。
  • 第5个写法完全是意外发现。取了首项的地址,于是输出了整个串?(存疑)

另外,第一种和第五种都可以通过首地址加数而实现从某项开始输出:
这里写图片描述

  • a+1:则从第二个字母 t 开始输出。

  • a[2]:则从第三个字母 u 开始输出。

下面来说指针。
“将字符指针作为串地址,为管理字符串提供了方便”

    char *p="student";

要记住,p只是个普通的字符指针,不是数组,所以不能用初始化字符数组的方式(上文第一种)来初始指针,那就错到家了。。
实际上,字符串在系统中是作为“串常量”存贮在常量区的(当然,也有自己的地址)。所以按理来讲,只有常指针可以指向它,用普通字符指针指向它会报错。

[Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
[警告]不被赞成的将串常量转变为字符型指针的转换(我在翻译些什么???)

而关于指针的输出
这里写图片描述
基本上和数组时类似:

  • 写指针的名字“p”即可整串输出。
  • 写名字加星号就只能输出首字母。
  • 取地址。。就取地址呗。。

怕自己疯掉就没有尝试其他形式。这里存的疑问我认为是因为对于内存分配问题并没有研究过,对于一个字符串在内存里的样子也不是很理解。所以想完全解释清楚也很无力。

次日编:
“C++没有把字符串作为基本类型,字符串常量是用双引号相括的字符序列,以数组形式存放。”
这句话在教材里出现在第一章,也就是作为向初学者介绍C++大致体系思想的地方,或许可以用来解释上述的问题、。。

P.S.:
这篇总结本来早该发的。但是上一次在完成了60%,因为翻自己之前的文章找例子时发现了一个错误,遂改。那篇文章发出去之后,发现这个编辑器里面空了。空。了。。草稿箱里也没存,就这么完美的不见了。

后来明白了。当我打开之前那篇文章时,编辑器只有一个,于是覆盖掉了正在码的文。所以就。。没了。。

所以现在再来写好像稍微有点抓不住重点的意思。。如有不足,欢迎指正。以后我会继续完善。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值