(1)32位操作系统中:
数据类型 | 所占字节 |
---|---|
bool | 1 |
char | 1 |
short | 2 |
int | 4 |
long int | 4 |
float | 4 |
double | 8 |
long double | 10 |
void * | 4 |
64位操作系统中:
数据类型 | 所占字节 |
---|---|
bool | 1 |
char | 1 |
short | 2 |
int | 4 |
long int | 8 |
float | 4 |
double | 8 |
long double | 10 |
void * | 8 |
除了long int
和void *
,其他都一样。
(2)关于输出:
%d
整型
%u
以十进制输出——dec
%o
以八进制输出——oct
%x
以十六进制输出——hex
%c
字符型
%f
浮点型
%s
字符串
(3)scanf("%d", &iInt);
从控制台输入;printf("%d", iInt);
从控制台输出。
(4)&按位与,|按位或,^按位异或。
(5)左移运算符<<
相当于乘以2的幂;右移运算符>>
相当于除以2的幂。
(6)sizeof()
返回指定的数据类型或者表达式的值的数据类型在内存中所占的字节数。
(7)强制类型转换:(类型说明符)表达式
。
(8)break
中断循环(只跳出一层循环);continue
跳出本次循环体的执行,回到条件测试部分。
goto语句为无条件跳转语句。
(9)如果形参是指针类型,调用时就将地址值传递给形参。
(10)函数的返回值类型不作为区分重载函数的一部分(以参数类型以及参数个数来区分)。
(11)当局部变量和全局变量同名时,程序优先使用局部变量,若要使用全局变量,则应在变量前加上区域符号::
。
(12)auto
自动变量(int、char等等);static
静态变量;register
寄存器变量;extern
外部变量。
自动变量在函数内定义就只能在函数内使用,在复合语句中定义就只在该复合语句中有效;
静态全局变量的值在函数调用结束后不消失,且只能在本源文件中使用,与自动变量类似,在函数内定义就在函数内使用,尽管该变量还继续存在,但不能使用它,当再次调用定义它的函数时才可继续使用;
为了节省反复访问内存储器花费的存取时间,提高效率,可以将变量声明为寄存器变量,将局部变量的值存放在CPU的寄存器中;
在使用其他源文件中的全局变量时,只需要在本源文件使用extern
关键字来声明该变量即可。
(13)一个变量的地址称为该变量的指针,指针访问该变量在内存中的地址;引用是变量的别名,它们使用同一块地址。
代码经过编译后将变量名转换为该变量在内存的存放地址,对变量值的存取都是通过地址进行的。
指针赋值:
int i = 0;
int *p = &i;//取变量i的地址赋给指针变量p;指针变量名是p而不是*p;不能将*p当变量使用。
//等同于:
//int * (p = &a);
指针变量存储的是地址值,不可以直接赋值,对指针做运算就等于对地址作运算。定义指针变量时必须指定一个数据类型,用来指定该指针变量所指向数据的类型。
*
是指针运算符,&
是取值(取地址)运算符。通过指针运算符*
可以得到该地址对应的数值,通过取地址运算符&
可以得到该变量的地址。
&*p
和*&a
的区别:
&*p
是先进行*
运算,*p
相当于变量a,再进行&
运算,&*p
相当于取变量a的地址;
*&a
是先进行&
运算,&a
就是取a的地址,在进行*
运算,*&a
相当于取a所在地址的值,实际就是变量a。
空类型指针void* p
可以接受任何类型的指针,使用时可以将其强制转化为所对应的数据类型。
void *pV = NULL;//NULL表示空值//指针地址为0,但不意味着这块内存可以使用
cout << *(int*)pV <<endl;//强制转换为int型指针
指针常量与指向常量的指针:
int i = 0;
int * const p = &i;//指针常量
*p = 3;//无法改变内存指向,但可以改变它指向内存的值
const int * pp = &i;//指向常量的指针,指向的数据/地址可以通过赋值语句修改,但不能通过该指针修改内存内容
const int * const ppp = &i;//指向常量的指针常量,既不能改变内存指向,也不能通过它修改内存内容
(14)用指针传递参数时void swap(int *a, int *b)
,指针变量产生了副本,但这个副本与原变量所指向的内存区域是同一个。对指针副本指向的变量进行改变,就是改变原指针变量所指向的变量。
(15)返回指针类型的值的函数简称为指针函数。
int sum(int x, int y)
int *a(int, int); //定义函数指针
a = sum;
//使用
int c, d;
*a(c, d);
(16)空类型指针void *pV = NULL;
。使用空指针调用它所指向的函数,要按照强制转换的形式使用。函数重载时不要使用。
(17)如果没有申请动态分配内存的方式,变量的值将被放到栈中,所属的内存大小无法改变;如果申请使用动态分配方式去储存某个变量,这个变量会被放入堆中,内存大小可以发生改变。
使用new
动态分配内存要手动delete
销毁内存,销毁时要保留指向该堆内存的指针,当没有指针指向一块没被回收的堆内存时,此块内存如同丢失一般称为内存泄漏;静态分配内存会自动释放。
(18)左值引用:
数据类型 & 表达式
引用实际上是一种隐式指针,为对象建立一个别名。引用要进行初始化。以下代码执行ra = 2
和a = 2
等价。
int a;
int &ra = a;//定义一个引用变量ra,它是a的别名,引用
ra = 2;
指针是一种数据类型,引用不是。
右值引用:
数据类型 && i= 被引用的对象
右值是临时变量,如函数的返回值,并且无法被改变。
(19)值传递:调用函数不会影响实际参数的值;
引用传递:调用函数修改参数的值,其改变会影响到实际参数。
指针传递参数属于一种值传递,传递的是指针变量的副本。
int* &p;//指针的引用 //可在函数体内改变指针的地址 //指针指向变量的引用,相当于指针指向了该变量
//int& *p;//非法,引用类型不存在指针 //别名无法被指针指向
(20)当1,true,或者表达式等临时变量作为函数实参传递时,按左值引用会被编译器阻止;进行值传递时又将会产生一个和参数同等大小的副本。
这种情况使用右值引用传递参数,既不会申请局部变量,也不会产生临时副本。
右值引用只接受右值实参,可以将它看作是临时变量的别名。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通