5.C++指针和引用

5.1指针的创建

intp = &a;//普通变量前加&,意思是取地址
指针也是变量,用来存值的,用来保存另外一个变量的地址(指针只能保存和它类型相同的变量的地址)
如果指针的类型是相同的,那么指针之间也可以相互赋值
除初始化之外,指针前如果再加
,表示获取这个地址里的变量
如果修改了*p的内容就等于间接修改了变量a

*p = 120;
cout << a << endl;
a = 25;
cout << *p << endl;

指针的初始化,如果没有变量的地址赋值,可以赋值为0,NULL,nullptr

int*p = nullptr;

指针非空判断

//int *p = new int(10);
int*p = nullptr;
if(p){
cout<<“指针为空”<<endl;
}

初始化的时候,如果有多个变量参与,只有前面带*才是指针

int* a = nullptr, * b = nullptr, c=0, d=0;

指针初始化数组
数组的名字就是数组的第一个元素的地址,也叫做首地址

int arr[10] = { 12,21,34,57,8,9,65,78,44 };
int* p = arr;

野指针
野指针里面保存的是未知地址
如何判断这个指针是否能用,判断这个指针是否为空
使用指针的前提是这个指针不能为野指针

int* p;

直接创建指针
只要是new出来的变量或者数组都存在与堆上,即便运行完毕也不会自动回收,只能手动
使用delete+指针名删除内存
删除一个指针之后,编译器只会释放该指针所指向的内存空间,而不会删除这个指针本身,所以要NULL一下将这个指针变成空指针,防止变成野指针

int* p = new int(10);
delete p;

指针创建数组

int* p = new int[10];
int* p = new int[10]{1,2,3};
delete[]p;
p[1]//输出2

5.2指针的操作

如果delete释放的是未new的内存的话,会导致程序崩溃,空指针直接delete不会发生问题

int* p = nullptr;
delete p;

指针如果创建的是数组,那么在释放这个指针之前要注意让这个指针保存数组的首地址
如果指针只new,而且不停的new,从来没有delete,那么之前所new的内存造成了内存泄露,后期就删不了了

  • 常量指针,const的右边是就是常量指针,const右边修饰的是p,只要出现*p=就算错误
  • 指针常量,const的左边是*就是指针常量,const右边修饰的是p,只要出现p=就算错误
int a = 10;
int const* p = &a;
int * const p = &a;
  • 函数指针,也叫做委托、代理,把函数像变量一样保存在一个指针里,那么这个指针在使用的时候就和函数一样来用,直接把函数的名字赋值给函数指针即可
函数指针如何写,函数返回值类型(*加给函数指针起的名字)(参数1类型,参数2类型....)
int addNumber(int a, int b) {
	return a + b;
}
int(*p)(int,int);
p = addNumber;
cout << p(3, 5) << endl;
如果函数没有参数,那么最后写(void)或()
例:
void(*p)(void);
void(*p)();
  • 指针函数就是一个函数的返回值是指针
    (1)如果返回值是一个普通变量的地址的话,函数将返回值地址里的数值赋值给外部变量,这样操作是很安全的
    但是如果函数是将返回值地址赋值给另一个指针的话,这样不安全
    (2)如果返回值是函数里的一个数组地址的话,无论怎么赋值均为错误操作
    (3)如果返回值是函数里的一个通过new创建的内存的地址的话,怎么返回都是安全的
int* getNumber() {
	int a = 20;
	return &a;
}
int getSafeNumber() {
	int a = 20;
	return a;
}
int* getArray() {
	int arr[5] = {123,311,4,7,9};
	return arr;
}
int* getArray() {
	int *arr = new int[5];
	return arr;
}
错例
int* p = getArray();
cout << *p << endl;
for (int i = 1; i < 5; i++,p++) {
	cout << *p << endl;
}

5.3引用

&初始化的时候是引用,其它是取地址,函数形参前加&是引用,是特例
引用跟指针类似,只是初始化的时候变量前加&,引用就是被引用变量,只是换了名字

int a = 10;
int& b = a;
b += 5;
cout << a << endl;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值