指针作为函数参数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
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
内存,此时i
和c
指向两个不同的地方,给这个新的位置赋值为3
,跟*c
没有什么关系。