c语言指针参数

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 */
View Code

分析: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 */
View Code

分析: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 */
View Code

分析:通过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 */
View Code

分析: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 */
View Code
 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 */
View Code

注意指针所指向的内存是在函数内分配的还是在函数外分配的,以及是不是在堆上分配的。  你定义了一个指针,但是并没有分配指针指向对象所需的内存空间;当函数返回后,此函数栈中的内存会被释放掉,不要让指针指向此函数栈中的内存空间,要指向堆上或此函数外的内存空间。

转载于:https://www.cnblogs.com/MGT614469730/articles/5854901.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值