C语言出参处理

**

C语言出参处理及常量指针(指向常量的指针)指向的改变:

**

1、C语言中的函数出参与面向对象语言不同,普通变量(非指针)入参时要降为指针,取其地址传入函数修改其值。

#include <string.h>
#include  <stdio.h>
#include <ctype.h>

void setintvalue(int *p_x)
{
    *p_x = 20;
    printf("未调用setx2时 x:%d\n",*p_x);
    setx2(&p_x);
}

int main()
{
    int x = 10;
    setintvalue(&x);
    printf("main: | x:%d\n",x);

    return 0;
}

/*
setstr: | str1:global | str2:global 
main: | str1:global | str2:right | p:aello 
未调用setx2时 x:20
setx2:30
main: | x:30
*/

2、常量指针(指向常量)改变指向(从而改变内容)的方法
2.1、异域(传入某函数作为出参时)可使用其二级指针改变其指向:

void sety(const int ** y)
{
    int a =1;
    (*y)=&a;
}

void set_str(const char **str1,const char *str2)
{
    *str1 = "global";
    str2 = "global";
    printf("setstr: | str1:%s | str2:%s \n", *str1,str2);
}

void main (void)
{
    int x =10;
    const int *y = &x;
    sety(&y);
    printf("y里值:%d\n,y地址:%#x",*y,y);

    char a[6]="hello";
    const char *str1 = "left";
    const char *str2 = "right";
    char* const p = a;
    a[0] = 'a';
    //*p = 'b'; //也可修改成功

    set_str(&str1,str2);
    printf("main: | str1:%s | str2:%s | p:%s \n", str1,str2,p);
}
/*
y里值:1
,y地址:0xd01f1eec

setstr: | str1:global | str2:global 
main: | str1:global | str2:right | p:aello 
*/

2.2 同区域直接改变指向

void main (void)
{
    int x =10;
    int b = 100;
    const int *y = &x;
    y = &b;
    printf("y里值:%d\n,y地址:%#x",*y,y);
}

3、普通一级指针需要作为出参时
要么降级、要么直接*p = …;来改变其值

int d =1000;
int *c = &d;//全局量

void setcom(int *y)
{
    int b =1000;
    // y=&b;    //不可行,y出去后,内容还是旧值
    //y = c;     //不可行

    *y = *(c);//可行
    //*y = d; //可行
    //*y=1000;//可行
}

void setcom2(int **y)
{
    int b =10000;
    *y=&b;
}

void main (void)
{
    int x =10;   
    int *y = &x;
    setcom(y);
    printf("setcom:y里值:%d\n,y地址:%#x\n",*y,y);

    setcom2(&y);
    printf("setcom2:y里值:%d\n,y地址:%#x\n",*y,y);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xyz_sky

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

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

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

打赏作者

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

抵扣说明:

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

余额充值