目录
- 一、数据类型的介绍
- 二、数据的变量和常量
- 三、变量的作用域和生命周期
- 四、字符串
- 五、转义字符
- 六、操作符
- 六、常见的关键字
- 6.1 关键字static
- 七、内存分配
- 八、结构体
- 九、指针
一、数据类型的介绍
sizeof是一个操作符,是计算机类型/变量所占内存空间的大小
scanf函数返回的是读取到数据的个数,如果scanf函数读取失败会返回EOF(EOF end of file 文件结束标志,#define EOF -1)
多组输入:while(scanf(“%d”,&q)==1) 如果读取到一个数就持续输入,否则返回EOF
scanf函数每次读取一个字符,跳过所有的空白字符,直到遇到第一个非空白字符的时候才开始读取。并且在读取到第一个空白字符后结束读取,将空白字符之后的所有字符都暂存在缓冲区中。除非缓冲区被刷新( fflush(stdout) )或者字符被读取走,否则将一直停留在缓冲区中。
多组输入读一个字符通常用getchar()。如果读取到一个字符就返回该字符的ASCII码值,否则返回EOF。(while(ch=getchar())!=EOF)
处理缓冲区的\n的问题也通常使用getchar()函数来处理。 (getchar(); 处理\n)
%d—是以十进制的形式打印一个整数
%c—以字符的形式进行打印
%s—以字符串的形式进行打印
%f—以float的形式进行打印,默认保留6位小数。%.nf指定保留n位小数。%mf指定输出宽度为m个字符,如果少于m个字符,则右对齐并用空格填充左侧。%e以科学计数法输出浮点数。
%lf—以double的形式进行打印
%ld—以long的形式进行打印
%lld—以long long的形式进行打印
%p—以地址的形式进行打印,是以16进制的形式表示地址的
%zd—以size_t的形式进行打印
%u—以无符号整型的形式进行打印
%x—以十六进制无符号整型的形式进行打印
内置的数据类型,C语言本身就具有的类型。(char,short,int,long,long long,float,double等)
自定义类型,允许你创建出来的类型。(结构体类型等)
整型(int)表示的最大最小整数值是(2147483647)和(-212147483647-1)
1字节(byte)等于8个bit位(bite)
一个汉字占两个字节
1KB等于1024个字节
55.5小数直接写出来,编译器默认是double类型的
55.5f 这个时候是float类型
二、数据的变量和常量
首先原则上我们的变量名尽量不要冲突
但是当全局变量和局部变量的名字冲突的情况下, 局部优先的
三、变量的作用域和生命周期
作用域:
1.局部变量的作用域是变量所在的局部范围
2.全局变量的作用域是整个工程
生命周期:
1.局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束
2.全局变量的生命周期是:整个程序的生命周期
全局变量未初始化的话默认为0,局部变量未初始化的话默认为随机值(可能会出现编译错误)
extern 用于声明外部符号
四、字符串
\0是字符串的结束标志
printf 以%s打印字符串的时候,就要从你给的地址开始打印,一直打印遇到\0,停止。
printf的返回值是屏幕上打印字符的个数,包括\0的个数
printf(“%02d”) 表示以十进制整型方式打印,保留两位数,不够用0补齐
printf(“%.2d”)
printf(“%02d”)
strlen是库函数,用来求字符串长度的,就是从给定的地址,向后数字符,直到遇到\0,结束,\0不统计在内。
统计ch1的字符长度是随机值,因为不知道字符串后面的\0的位置。ch2则是以\0为结尾的字符串。
sizeof和strlen的对比
1.sizeof是操作符,strlen是库函数
2.sizeof计算的占有内存的大小,单位是字节,不关注内存中存放的具体数据
strlen是求字符串长度的,只能针对字符串,统计的是字符串中\0之前出现的字符的个数
五、转义字符
转义字符 | 释义 |
---|---|
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
\’ | 用于表示字符常量’ |
\‘’ | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字。如:\130 表示字符X |
\xdd | dd表示2个十六进制数字。如:\x30 表示字符0 |
ASCII表
8进制的130,转换成10进制后得到88,把88作为ACSII值代码的字符就是X
16进制的30,转换成10进制后得到48,把48作为ASCII值代码的字符就是0
int main() {
int hex1 = 0x1A; // 十六进制数字,等价于十进制的 26
int hex2 = 0xabc; // 十六进制数字,等价于十进制的 2748
int octal = 0123; // 八进制数字,等价于十进制的 83
}
六、操作符
算数操作符
+ - * /(1.计算的结果是整除之后得到的商。2.除法有整数除法和浮点数除法(保证除数和被除数中至少有一个数是浮点数)) %(取模操作符(取余)得到的是余数,只适用于整数)
移位操作符
>> <<
位操作符
& ^ |
赋值操作符
= += -= *= /= &= |= >>= <<=
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
- - 前置、后置- -
+ + 前置、后置+ +
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
关系操作符
> 用于测试“大于”
>= 用于测试“大于等于”
< 用于测试“小于”
<= 用于测试“小于等于”
!= 用于测试“不相等”
== 用于测试“相等”
逻辑操作符
&& ^ 逻辑与
|| ^ 逻辑或
条件操作符
exp1 ? exp2 : exp3 epx1的结果为真则输出exp2的结果,否则输出exp3的结果
逗号操作符
exp1, exp2, exp3, …expN 结果为逗号的最后一个表达式的结果(但是需要计算前面逗号的表达式,可能会影响最后表达式的值)
下标引用、函数调用和结构成员
[] 下标引用
() 函数调用
. 结构成员访问
-> 结构成员访问
六、常见的关键字
关键字名称 | 作用 |
---|---|
asm | 表示与大括号一起使用时,大括号之间的每一行都是一条汇编语句。不与大括号一起使用,放在代码行首部,则表示其余部分是一条汇编语句 |
auto | 表示根据初始值自动推断变量的数据类型,不是每个编译器都支持auto |
break | 表示跳出循环,当程序执行到break语句时,会立即退出当前的循环,并继续执行循环后面的代码 |
case | 表示case关键字用于在switch语句中标识不同的情况。每个case标签后面跟着一个常量表达式,用于与switch语句中的表达式值进行比较 |
catch | 表示用于异常处理,try执行try块的起始,try块后的catch可以捕获异常,异常由throw抛出。throw在函数中还表示动态异常规范 |
class | 表示一般的类声明 |
const | 表示类型修饰符,用于变量或函数参数声明,表示只读类型(指定类型安全性,保护对象不被意外修改) |
const_cast | 表示取消常量属性,可以用来将一个常量指针或引用转换成一个非常量的指针或引用,同时保持它们指向原来的对象 |
decltype | 表示与auto关键字类似,用于编译时类型推导,但是并不像auto从变量声明的初始化表达式获得变量的类型,而总是以一个普通表达式作为参数,返回该表达式的类型 |
default | 1.表示在switch语句中用于指定当表达式的值与所有case标签都不匹配时应该执行的代码块。2.在C++11标准中通过参数列表后面写上=default来要求编译器生成默认构造函数 |
delete | 表示属于操作符,可以被重载。new表示向内存申请一段新的空间,申请失败会抛出异常。new会调用operator new函数,再在operator new函数里调用malloc函数分配空间,然后再调用构造函数。delete不仅会清理资源,还会释放空间。delete会调用析构函数,其次调用operator delete函数,最后在operator delete函数里面调用free函数。malloc申请内存失败后会返回空。free只是清理了资源,没有释放空间 |
do | 表示与while配合使用,先执行do后面的代码,然后再判断while后面括号里的值,如果为真,循环开始,否则,循环不开始 |
dynamic_cast | 表示父类的指针或引用转换为子类的指针或引用 |
explicit | 表示避免自定义类型的强制类型转换 |
export | 表示使用该关键字可实现模板函数的外部调用。对模板类型,可以在头文件中声明模板类和模板函数。在代码文件中,使用关键字export来定义具体的模板类对象和模板函数,然后在其他用户代码文件中,包含声明头文件后,就可以使用这些对象和函数了 |
extrern | 表示当修饰变量或函数时,表示其具有外部链接属性,即其既可以在本模板中使用也可以在其他模板中使用 |
final | 表示final修饰虚函数,表明子类不能重写虚函数 |
friend | 表示友元,使其不受访问权限控制的限制。例如在一个类中,私有变量外部是不能直接访问的,假如另外一个类或函数要访问本类的一个私有变量时,可以把这个函数或类声明为本类的友元函数或友元类,这样他们就可以直接访问本类的私有变量 |
inline | 表示内联函数,在编译时将所调用的函数代码直接嵌入到主调用函数中。各个编译器的实现方式可能不同 |
mutable | 表示突破const的研制,mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中 |
namespace | 表示C++标准程序库中的所有标识符都被定义于一个名为std的namespace中,命名空间除了系统定义的名字空间之外,还可以自己定义,定义命名空间关键字“namespace”,使用命名空间时用符号“::”指定 |
new | 表示属于操作符,可以被重载。new表示向内存申请一段新的空间,申请失败会抛出异常。new会调用operator new函数,再在operator new函数里调用malloc函数分配空间,然后再调用构造函数。delete不仅会清理资源,还会释放空间。delete会调用析构函数,其次调用operator delete函数,最后在operator delete函数里面调用free函数。malloc申请内存失败后会返回空。free只是清理了资源,没有释放空间 |
noexcept | 表示告诉编译器该函数不会抛出异常,或者该函数可能会抛出异常 |
operator | 表示和操作符连用,指定一个重载了的操作符函数。比如:operator+ |
override | 表示检查基类虚函数的重写,没有重写会编译错误 |
protected | 表示保护的,只能在本类和友元中访问 |
private | 表示私有的,只能在本类,派生类和友元中访问 |
public | 表示公有的,访问不受限制 |
reinterpret_cast | 表示允许任意指针类型之间的转换,任意整型类型和任意指针类型的转换 |
register | 表示提示编译器尽可能的把变量存入到CPU内部寄存器中 |
static | 表示可修饰变量(静态全局变量,静态局部变量),也可以修饰函数和类中的成员函数。static修饰的变量的周期为整个函数的生命周期。具有静态生存期的变量,只有在函数第一次调用时,进行初始化,在没有显示初始化的情况下,系统把他们初始化为0 |
static_cast | 表示用于相近类型的转换,如:int换double |
switch | 表示switch语句包含了一个表达式和多个case标签。首先计算expression的值,然后将其与每个case标签的常量进行比较,如果找到匹配的case标签,将执行相应的代码块,直到遇到break语句或者switch语句结束 |
template | 表示声明一个模板,模板函数,模板类,模板的特化 |
this | 表示this是个特殊的指针,存放的是当前对象的首地址,在调用成员的时候,编译器会用this来调用成员。哪个对象调用成员函数,this指针就指向哪个对象 |
throw | 表示用于异常处理,try执行try块的起始,try块后的catch可以捕获异常,异常由throw抛出。throw在函数中还表示动态异常规范 |
try | 表示用于异常处理,try执行try块的起始,try块后的catch可以捕获异常,异常由throw抛出。throw在函数中还表示动态异常规范 |
typedef | 表示为现有数据类型创建一个新的名字,便于程序的阅读和编写 |
typeid | 表示运行时获取变量类型名称,可以使用typeid(变量).name() |
typename | 表示告诉编译器把一个特殊的名字解释为一个类型。比如:typedef int bar :bar 也是类型名,是类型int的别名 |
unsigned | 表示无符号数 |
using | 表示1.在当前文件引入命名空间using namespace std;2.在子类中使用,using声明引入基类成员名称 |
virtual | 表示声明虚基类,虚函数。虚函数=0时,则为纯虚函数,纯虚函数所在的类称为抽象类 |
volatile | 表示指定被修饰的对象类型的读操作是副作用(读取不能随便优化合并,适合映射I/O寄存器。1.当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中,以后再取变量值时,就直接从寄存器中取值。2.优化器在用到volatile变量时必须每次都小心地重新读取这个变量的值,而不是使用保存到寄存器的备份。3.volatile适用于多线程应用中被几个任务共享的变量) |
wchar_t | 表示宽字符型,表示多字节字符 |
6.1 关键字static
1.修饰局部变量——称为静态局部变量
static修饰局部变量的时候,本来一个局部变量是存放在栈区的,如果被static修饰就存储到静态区了。static修饰局部变量改变了变量的存储类型(位置),使得这个静态变量的生命周期变长了,直到程序结束才结束,但是作用域不变(不能在其他文件使用)。
2.修饰全局变量——称为静态全局变量
static修饰全局变量,改变了这个全局变量的链接属性,由外部链接属性变成了内部链接属性,这个静态变量只能在自己所在的源文件内部使用,不能在其他源文件内部使用了。感觉像是作用域变小了。
3.修饰函数——称为静态函数
static修饰函数和static修饰全局变量是一样的。函数是具有外部链接属性的,但是被static修饰,就变成了内部链接属性,使得这个函数只能在自己所在的源文件内部使用,不能在其他文件内部使用。
外部进行声明函数是只需要加函数参数的类型就行了,参数加不加都行。如:extern int Add(int x, int y) 其中:x,y可写可不写
宏和函数比较类似,定义宏则为#define Add(x,y) ((x)+(y))
七、内存分配
C/C++代码学习的时候,我们把内存大概分为3个区域:
栈区:局部变量,形式参数,临时作用的变量都在栈区。栈区上变量的特点:进入作用域创建,出了作用域销毁(还给操作系统)
静态区:动态内存分配,malloc,calloc,realloc,free
堆区:全局变量,静态变量。静态区的变量特点:创建好后,直到程序结束才销毁(还给操作系统)
八、结构体
定义以下结构体:
struct Stu
{
char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
};
结构体的初始化:
//打印结构体信息
struct Stu s = {"张三", 20, "男", "20180101"};
//.为结构成员访问操作符 (结构体变量.成员)
printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);
//->操作符 (结构体指针变量->成员)
struct Stu *ps = &s;
printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps-
>id);
结构体变量.成员
结构体指针->成员
九、指针
指针变量是用来存放地址的
32位机器上:地址是32个二进制位,这个地址要存储的话要4个字节,所以在32位机器上,指针变量的大小是4个字节。
64位机器上:地址是64个二进制位,这个地址要存储的话要8个字节,所以在64位机器上,指针变量的大小是8个字节。