C++零碎笔记(1)

这篇博客详细介绍了C++中的数据类型在不同操作系统下的字节数,以及各种输出格式。讨论了指针的使用,包括指针运算符、类型转换、void指针和空指针。此外,还讲解了函数参数传递、引用的概念和作用,以及值传递、引用传递和指针传递的区别。最后,涉及了动态内存分配和内存管理,包括栈和堆的区别以及内存泄漏问题。
摘要由CSDN通过智能技术生成

(1)32位操作系统中:

数据类型所占字节
bool1
char1
short2
int4
long int4
float4
double8
long double10
void *4

64位操作系统中:

数据类型所占字节
bool1
char1
short2
int4
long int8
float4
double8
long double10
void *8

除了long intvoid *,其他都一样。

(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 = 2a = 2等价。

int a;
int &ra = a;//定义一个引用变量ra,它是a的别名,引用
ra = 2;

指针是一种数据类型,引用不是

右值引用:

数据类型 && i= 被引用的对象

右值是临时变量,如函数的返回值,并且无法被改变。

(19)值传递:调用函数不会影响实际参数的值;
引用传递:调用函数修改参数的值,其改变会影响到实际参数。
指针传递参数属于一种值传递,传递的是指针变量的副本。

int* &p;//指针的引用 //可在函数体内改变指针的地址 //指针指向变量的引用,相当于指针指向了该变量
//int& *p;//非法,引用类型不存在指针 //别名无法被指针指向

(20)当1,true,或者表达式等临时变量作为函数实参传递时,按左值引用会被编译器阻止;进行值传递时又将会产生一个和参数同等大小的副本。
这种情况使用右值引用传递参数,既不会申请局部变量,也不会产生临时副本。
右值引用只接受右值实参,可以将它看作是临时变量的别名。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wrdoct

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值