首先,记住一句话
凡是出现在定义语句的时候,星号是指针定义标记。凡是出现在非定义语句中的时候,星号是取目标符。
使用指针有多方便?
赋值会非常轻松,高效。
比如,现有一个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,保留重要的变量
例子: