浅谈c++的指针魅力

首先,记住一句话
凡是出现在定义语句的时候,星号是指针定义标记。凡是出现在非定义语句中的时候,星号是取目标符。

使用指针有多方便?

赋值会非常轻松,高效。

比如,现有一个vector类型的函数,即返回的是vector。现在调用函数后想用一个变量来存该函数的返回值。如果不使用vector自带的赋值函数,比如swap或者是assign。或者是vector< int >v1(v2)方法。此时就需要用遍历的方法将数组里的每个元素进行复制到新的vector类型的变量中。非常麻烦。
若此时用指针的方法,就可以进行一次性的赋值到新的变量中。

指针赋值的陷阱

vector<int> Fun1(int x){
 ...
 return vector<int>{1,2};
}
int main(){
	int x=8;
	vector<int> *res=&Fun1(int x);
	for (int i=0;i<(*res).size();i++){
		cout<<*res[i]<<endl;
	return 0;
}

这样写会报[Error] taking address of temporary [-fpermissive],这样的错误。显然是和我们引用了临时变量的地址的锅。

函数的返回值是一个临时变量,也就是说在调用后立即释放空间。我们这里用新变量复制了该函数返回值的地址,也就是说新变量还是指向的是该临时变量。所以会报错。

解决方法
首先,Fun1的返回最好是改成指针,这样方便。【可选项】

方法1:

vector<int>* Fun1(int x) {
        
        vector<int>* result = (vector<int>*)malloc(sizeof(vector<int>));
        (*result).push_back(1);
        (*result).push_back(2);
		return result;
        }
int main(){
int x=8
vector <int> *res=Fun1(x)

将函数的返回的临时变量申请新的一块内存空间来存储,这样就不会自动被销毁。

方法2:
函数的返回值第一开始就设置为全局变量。

方法3:
将函数的返回的数组用遍历的方法一个一个复制到新的变量中。新的变量会开新的空间来存这些元素,之前的临时变量被销毁也无所谓。

附加一个小知识:

int Fun1(int &x){
pass
}
int Fun2(int x){
pass
}

两种传参的方式有无区别?

按道理没有区别,理由如下:
以int类型的举例,int后面跟的那个符号,在程序里面都只是地址(给地址的一个名称),所以所以说int a
和int 0x320000,按道理没区别,int后面跟地址还是跟字母,是不影响的。

以上理由可信度待考察。

对于函数返回的变量是临时变量的问题的另外解决方法:

利用关键字static,保留重要的变量

例子:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值