C++指针作为函数参数

指针作为函数参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
using namespace std;

int* test1(int* i)
{
i = new int;
*i = 1;
return i;
}

void test2(int* i)
{
*i = 2;
}

void test3(int* i)
{
i = new int;
*i = 3;
}

void test4(int** i)
{
*i = new int;
**i = 4;
}

void test5(int*& i)
{
i = new int;
*i = 5;
}

int main()
{
int *a;
a = test1(a);
cout << "test1: " << *a << endl; // 1

int *b;
b = new int;
test2(b);
cout << "test2: " << *b << endl; // 2

int *c;
test3(c);
cout << "test3: " << *c << endl; // Error

int *d;
test4(&d);
cout << "test4: " << *d << endl; // 4

int *e;
test5(e);
cout << "test5: " << *e << endl; // 5
}

C++在创建指针的时候,只分配存储地址的内存,并不会分配存储数据的内存,所以指针可能指向任何位置。

test1中,函数形参i只是实参a的拷贝,但在函数内部,我们为i重新分配了地址,然后为这个地址指向的位置赋值为1,然后将这个新分配的地址返回,即赋值给a,此时的a已经不是原来的a了。

test2中,我们首先为实参b分配了一个int内存,然后传入test2,形参i同样是是实参b的拷贝,在函数内部,为i指向的位置赋值2。

test3中,函数形参i只是实参c的一个拷贝,但在函数中,我们为i重新分配了一个int内存,此时ic指向两个不同的地方,给这个新的位置赋值为3,跟*c没有什么关系。

参考