目录

1、二阶指针做为形参的目的(使实参的值发生改变)

1、二阶指针作为形参的目的

1)普通变量做为形参,不能改变主函数中实参的值

例子:

 1 //01)形参改变,实参并没有改变的例子
 2 #include <iostream>
 3
 4 using std::cout;
 5 using std::endl;
 6
 7 /*交换a和b的值子函数*/
 8 void changeParameters(int a, int b)
 9 {
10     int temp;
11     temp = a;
12     a = b;
13     b = temp;
14 }
15
16 int main()
17 {
18     int num1 = 12;
19     int num2 = 22;
20     cout << num1 << " , " << num2 << endl;
21     changeParameters(num1, num2);  //此时num1和num2知识形参交换,实际参数并没有交换
22     cout << num1 << " , " << num2 << endl;
23
24     system("pause");
25     return 0;
26 }
普通变量作为形参和普通变了作为实参

运行结果:

2)一阶指针作为形参,变量地址作为实参可以改变主函数中实参的值

例子:

 1 //02)实参发生改变的例子
 2 #include <iostream>
 3
 4 using std::cout;
 5 using std::endl;
 6
 7 /*交换a和b的值子函数*/
 8 void changeParameters(int* a, int* b)
 9 {
10     int temp;     //此处改成int* temp交换地址,然后把*a和*b去掉也是可以的
11     temp = *a;
12     *a = *b;
13     *b = temp;
14 }
15
16 int main()
17 {
18     int num1 = 12;
19     int num2 = 22;
20     cout << num1 << " , " << num2 << endl;
21     changeParameters(&num1, &num2);  //此时是对存储空间这的两个数进行交换,所以num1和num2的值会发生交换
22     cout << num1 << " , " << num2 << endl;
23
24     system("pause");
25     return 0;
26 }
View Code

运行结果:

3)二阶指针做为形参,对指针用取地址运算符取地址后作为实参,可以改变实参的值

例子:

 1 #include <iostream>
 2
 3 using std::cout;
 4 using std::endl;
 5
 6 /*交换a和b的值子函数(相关解释见下)*/
 7 void changeParameters(int** a, int** b)
 8 {
 9     int* temp;
10     temp = *a;    //保存*a指向的地址
11     *a = *b;      //将*b指向的地址赋给*a指向的地址
12     *b = temp;
13 }
14
15 int main()
16 {
17     int a = 12;
18     int b = 22;
19     int* num1 = &a;
20     int* num2 = &b;
21     cout << *num1 << " , " << *num2 << endl;
22     changeParameters(&num1, &num2);  //对指针取地址,即只想指针的指针,或者是地址的地址
23     cout << *num1 << " , " << *num2 << endl;
24
25     system("pause");
26     return 0;
27 }
28
29 /*
30 int a = 12;  //假设存储a变量的地址是00424A30
31 int* pc = &a;  //则pc指向地址00424A30,假设存储pc的地址是00424A38
32 int** ppc = &pc;  //ppc指向pc的地址(00424A38)
33
34 cout << "a的地址是: " << &a << endl;  //打印  a的地址是: 00424A30
35 cout << "pc的值是: " << pc << endl;  //打印   pc的值是: 00424A30  pc的值就是a的地址
36 cout << "*pc的值是: " << pc << endl;  //打印  *pc的值是: 12
37 cout << "pc的地址是: " << &pc << endl;  //打印  *pc的值是: 00424A38
38 cout << "ppc的值是: " << ppc << endl;  //打印  ppc的值是: 00424A38  (ppc的值就是pc的地址)
39 cout << "*ppc的值是: " << ppc << endl;  //打印  ppc的值是: 00424A38  (ppc的值就是pc的地址)
40 cout << "*(*ppc)的值是: " << *(*ppc) << endl;  //打印  ppc的值是: 2
41 */
View Code

运行结果:

在例子中的一个解析:

 1 int a = 12;  //假设存储a变量的地址是00424A30
 2 int* pc = &a;  //则pc指向地址00424A30,假设存储pc的地址是00424A38
 3 int** ppc = &pc;  //ppc指向pc的地址(00424A38)
 4
 5 cout << "a的地址是: " << &a << endl;  //打印  a的地址是: 00424A30
 6 cout << "pc的值是: " << pc << endl;  //打印   pc的值是: 00424A30  pc的值就是a的地址
 7 cout << "*pc的值是: " << pc << endl;  //打印  *pc的值是: 12 
 8
 9 cout << "pc的地址是: " << &pc << endl;  //打印  *pc的值是: 00424A38
10 cout << "ppc的值是: " << ppc << endl;  //打印  ppc的值是: 00424A38  (ppc的值就是pc的地址)
11
12 cout << "*ppc的值是: " << ppc << endl;  //打印  ppc的值是: 00424A38  (ppc的值就是pc的地址)
13 cout << "*(*ppc)的值是: " << *(*ppc) << endl;  //打印  ppc的值是: 2  
View Code

参考博客:https://blog.csdn.net/qq_34991245/article/details/81868212

2、

02-10 04:43