一文理解一维指针与二维指针在参数中的传递

总结:一维指针

如:
int *c;                //定义一个指针C
int d=10;            //变量的值为10
c=&d;               //指针c指向d的地址
当执行*c=5时;即等价于执行d=5;
总结:二维指针
如:
int **a;  //定义二维指针。即指向指针的指针 
int *c;   //定义一维指针
int d=10;
a=&c;     //二维指针指向一维指针c的地址
当执行*a=&d,即等价于执行c=&d
当执行**a=5时,即等价于执行*c=5,等价于执行d=5

下面是实际情况解析,如果上面能懂下面就不必要了

我们平常使用指针把参数从函数中传递出来,传递的是指针所指向的内容

话不多说直接看下面的程序,读懂一维指针

#include <stdio.h>
void fun(int *a);
int main()
{
int *c;                      //定义一个指针C
int d;                       //定义一个变量
d=10;                      //变量的值为10
c=&d;                     //c指向d的地址
fun(c);                    //将指针C传入参数中
printf("%d\n",*c);  //猜猜这里C输出值是5还是10
return 0;
}
void fun(int *a)
{
int b=5;
a=&b;
}

很明显C输出的值还是10,因为C所指的地址并没有改变,
我们来分析一下void fun(int *a);这个函数

首先当执行 fun(c);                    //将指针C传入参数中

实际等价于

a=c;//即a指向c的地址,即此时为a=c=&d

然后在fun()函数中定义了变量

int b=5;

执行a=&b;   即a所指的方向发生了改变,但是c所指的方向并没有改变

所以c指针所指的地址还是原来的 c=&d

因此当执行printf("%d\n",*c);时

输出的值为c所指地址的内容即输出为10。

那有什么办法可以将 可以将b的值传递给C呢?

下面介绍两种方法,一种还是用一维指针,另一种就是今天要介绍的二维指针了

先介绍第一种

void fun(int *a)
{
int b=5;
a=&b;
}

这是原来的函数内容,我们只需做如下改变即可

void fun(int *a)
{
int b=5;
*a=b;
}

原理很简单

当执行 fun(c);                    //将指针C传入参数中

a=c;//即a指向c的地址,即此时为a=c=&d

执行*a=b;即执行d所处地址的内容等于b;

最终执行

printf("%d\n",*c);  

此时输出的值C=5。

另一种方法即二维指针

void fun(int *a)
{
int b=5;
a=&b;
}

这是原来的内容,我们只需做如下修改

void fun(int **a)
{
int b=5;
*a=&b;
}

当执行fun(c); 

二维指针int **a指向c指针的地址

而当执行*a=&b;时

即是将指针C所指d的地址改为b的地址。

因此当执行

printf("%d\n",*c);  时

输出的值就为5了
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼儿-余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值