1.参数传递原则:实参传递给形参,不能反向传递。
所以一般实参传递给函数时,一般都是复制实参进行传递。
1 #include <stdio.h> 2 3 /* 4 * 经典加法 5 */ 6 int add(int a, int b); 7 8 int main() 9 { 10 int a = 5; 11 int b = 4; 12 int sum = add(a, b); 13 14 printf("sum(%d,%d)=%d\n", a, b, sum); 15 16 return 0; 17 } 18 19 int add(int a, int b) { 20 21 a = 7; 22 b = 6; 23 24 return a + b; 25 } 26 27 /* 28 * sum(5,4)=13 29 */
分析:main()函数里面的a,b实参传入add()函数中,先进行参数复制变为_a和_b,然后将_a和_b参数传入add(int *a = _a, int *b = _b)。
2.一级指针:修改指针ptr指向的值。
按照1的说法,一级指针ptr在传递给函数过程:复制指针ptr为_ptr,传递复制指针_ptr给函数。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 /* 5 * 经典加法 6 */ 7 8 int sum(int *a, int *b); 9 10 int main() 11 { 12 int *a = (int*)malloc(sizeof(int)); 13 *a = 5; 14 int *b = (int*)malloc(sizeof(int)); 15 *b = 4; 16 17 printf("sum(%d,%d)=%d\n", *a, *b, sum(a, b)); 18 19 return 0; 20 } 21 22 int sum(int *a, int *b) { 23 24 *a = 7; 25 *b = 6; 26 27 return *a + *b; 28 } 29 30 /* 31 * sum(7,6)=13 32 */
分析:main()函数里面的一级指针a,b实参传入add()函数中,先进行参数复制变为_a和_b(_a和_b指向的地址和a与b一样均是指向整型5和4),然后将_a和_b参数传入add(int a = _a,
int b = _b)。所以一级指针可以改变函数外的指针指向的值。
但是如果我们要改变指针本身呢?二级指针,即指向指针的指针
3.二级指针:修改指针ptrptr指向的指针ptr。
按照2的说法,二级指针ptrptr在传递给函数过程:复制指向指针ptr的指针ptrptr为_ptrptr,传递复制的指针_ptrptr给函数。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 /* 5 * 经典加法 6 */ 7 int sum(int *a, int *b); 8 9 int i = 5, j = 4, k = 7, l = 6; 10 11 int main() 12 { 13 int *a = (int*)malloc(sizeof(int)); 14 i = 5; 15 a = &i; 16 int *b = (int*)malloc(sizeof(int)); 17 j = 4; 18 b = &j; 19 20 printf("sum(%d,%d)=%d\n", *a, *b, sum(a, b)); 21 22 return 0; 23 } 24 25 int sum(int *a, int *b) { 26 27 a = (int*)malloc(sizeof(int)); 28 b = (int*)malloc(sizeof(int)); 29 a = &k; 30 b = &l; 31 32 return *a + *b; 33 } 34 35 /* 36 * sum(5,4)=13 37 */
分析:通过malloc动态分配内存,使指针a和b在函数中的复制指针_a和_b指向新的内存空间,所以导致main()函数内的指针a和b并没有变化。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 /* 5 * 经典加法 6 */ 7 int sum(int **a, int **b); 8 9 int i = 5, j = 4, k = 7, l = 6; 10 11 int main() 12 { 13 int *a = (int*)malloc(sizeof(int)); 14 i = 5; 15 a = &i; 16 int *b = (int*)malloc(sizeof(int)); 17 j = 4; 18 b = &j; 19 20 printf("sum(%d,%d)=%d\n", *a, *b, sum(&a, &b)); 21 22 return 0; 23 } 24 25 int sum(int **a, int **b) { 26 27 *a = (int*)malloc(sizeof(int)); 28 *b = (int*)malloc(sizeof(int)); 29 *a = &k; 30 *b = &l; 31 32 return **a + **b; 33 } 34 35 /* 36 * sum(7,6)=13 37 */
分析:add()函数传入指向指针的指针_a和_b,即main()函数的指针a和b地址,add(int **a=_a, int **b=_b)使得指向的指针变化。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 /* 5 * 经典加法 6 */ 7 int sum(int **a, int **b); 8 9 int main() 10 { 11 int *a = (int*)malloc(sizeof(int)); 12 int i = 5; 13 a = &i; 14 int *b = (int*)malloc(sizeof(int)); 15 int j = 4; 16 b = &j; 17 18 printf("sum(%d,%d)=%d\n", *a, *b, sum(&a, &b)); 19 20 return 0; 21 } 22 23 int sum(int **a, int **b) { 24 25 int i = 7; 26 *a = &i; 27 int j = 6; 28 *b = &j; 29 30 return (**a + **b); 31 } 32 33 /* 34 * sum(5,4)=13 35 */
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 /* 5 * 经典加法 6 */ 7 int sum(int **a, int **b); 8 9 int i, j, k, l; 10 11 int main() 12 { 13 int *a = (int*)malloc(sizeof(int)); 14 int i = 5; 15 a = &i; 16 int *b = (int*)malloc(sizeof(int)); 17 int j = 4; 18 b = &j; 19 20 printf("sum(%d,%d)=%d\n", *a, *b, sum(&a, &b)); 21 22 return 0; 23 } 24 25 int sum(int **a, int **b) { 26 27 k = 7; 28 *a = &k; 29 l = 6; 30 *b = &l; 31 32 return (**a + **b); 33 } 34 35 /* 36 * sum(5,4)=13 37 */
注意指针所指向的内存是在函数内分配的还是在函数外分配的,以及是不是在堆上分配的。 你定义了一个指针,但是并没有分配指针指向对象所需的内存空间;当函数返回后,此函数栈中的内存会被释放掉,不要让指针指向此函数栈中的内存空间,要指向堆上或此函数外的内存空间。