c语言指针改变数组值,C语言指针及数组改值问题

voidclear_string(char*str)

{

str=NULL;

}voidget_string(char*str)

{charch;inti;for(i=0; i<3; i++) {

ch=getchar();if(ch=='\n')return;

str[i]=ch;

}

}intmain(void)

{charstring[4]={'\0'};

get_string(string);

printf("Before clear, string:%s\n",string);

clear_string(string);

printf("After clear, string:%s\n",string);return0;

}

==============================================================

首先说这段代码的问题,为何clear_string不生效,为什么?对于main函数中的string变量以及

clear_string中的str,它们指向同一个地址,由于所指定的类型也是一样的,基本可以认为它们就是一回事,只是要时刻牢记我们调用

clear_string(string);,实际上是把string第一个元素起始地址作为参数传入。

要记住一个原则:C语言中,任何函数想修改传入的值,然后返回给调用方,一定是类似这样的 *pOut = value;

这个原则非常非常重要。

回到clear_string()这个函数,str =

NULL;是什么效果呢?这意味着我们从这一行开始,到有效地block结束(对当前函数而言block结束就是函数结尾)或者下一个对str的赋值之

前,我们把str赋值为NULL。注意我们修改的是str的值,相当于把str重新指向NULL这个地址。在这里,str是作为函数的局部变量使用,不影

响调用方传入的值,这就好比这样一个函数原型

void SetZero(int iVal)

{

iVal = 0;

}

任何一个稍有C语言基础的朋友都知道,当我们这样调用int iValCaller = 5;

SetZero(iValCaller);运行以后,iValCaller的值依然是5。可以这样认为,程序运行调用SetZero函数的时候,把参数

iVal在程序运行栈上做了一份拷贝(copy)传递给函数,函数SetZero对拷贝(copy)做的修改不会影响到调用方变量。

如果想影响母体,只有一种方式,就是把调用方变量的地址传递给函数,这时候通过指针就可以间接操作调用方变量值了,这也是指针的最大功用。

知道了问题,修改就很容易了,下面的写法才是指针型变量最常用的代码片段:

如果我想修改str,比如某个函数负责申请一块内存返回,这时候我们修改的是指针地址(&p)的值,那么就要传入需要指针的指针。

void AllocBuffer(char** ppBuf, int size)

{

*ppBuf = malloc(size);

}

注意,其实质还是*p = value;这种模式。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值