关于指针参数返回的问题

绿色盒子 2019-03-26 05:09:01
有这么个函数

void funtion(char * pBuff)
{
......
}


一下两种请况有啥区别,为什么参数是数组的时候没法返回值

char a;
funtion(&a);



char b[128];
funtion(b);
...全文
1217 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenandanran 2019-03-28
  • 打赏
  • 举报
回复
lz可以试一下在后面输出b[1],如果b[1]也变了,有可能前面a处理越界了。没变的话,就是23楼那样。一般好像传递给函数数组的指针改变,对函数外部是没影响的。可以借鉴p=p+1,表面是让p首地址指向下一个。然而函数结束后,外部的p还是原来的首地址p,而不是p+1。大概就类似,传递的是数组首地址,但是用的是另一个指向这个首地址的指针,给你提供赋值数据操作,但是你改变这个指针指向并不会改变外部那个原指针的指向。不是有句话说按值传递么
a_biyudao 2019-03-28
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

void fun(char *p)
{
*p='b';
}
int main()
{
char a='a';
fun(&a);
printf("%c\n",a);

char b[128]="aaaaaa";
fun(b);
printf("%s\n",b);

system("pause");
return 0;
}
自己去运行一下吧,没有问题的,你不是函数体写错了,就是输出函数写错了。注意一下字符串输出的时候是否是%s
zhgwbzhd 2019-03-28
  • 打赏
  • 举报
回复
课本知识只是初级的理解。和真正的实战还是有很大的差别。
下面个人的经验,会修改如下地方。
1 #include <stdio.h>
2 #include <string.h>
3 void func(char *pbuf)
4 {
//这里复制这么长的字符串,那么就需要要求调用该函数时,内存分配必须至少多少,需要定义的。
5 *pbuf = “hello world”;//我这里是字符串
6 }
7 int main(int argc, char *argv[])
8 {
9 char a = 'a';
//这里调用函数,函数写了很长的字符串,但是这里只声明了一个字符变量,内存溢出绝对的。放到项目内程序常崩溃。
10 func(&a);
11 char b[1] = {'b'};
//一个原因如上不说了,另外申请了数组,数组内容会被改动的话,最好先用memset函数清零一下。否则可能因结尾字符不是空而带来乱码
12 func(b);
13
14 printf("a:%c,b[]:%c\n", a, b[0]);
15
16 return 0;
17 }
amwrdfe 2019-03-28
  • 打赏
  • 举报
回复
数组的话,有越界的可能,
sichuanwww 2019-03-28
  • 打赏
  • 举报
回复
luj_1768 2019-03-28
  • 打赏
  • 举报
回复
按照比较早初的参数传递方法,传值的做法是先把数据一个个的压入堆栈,再由函数一个一个的计算偏移量使用。如果是数组的话,好像会引发不少问题。。。
勒恩 2019-03-28
  • 打赏
  • 举报
回复
输入b[0]是什么意思?
smoyuan 2019-03-28
  • 打赏
  • 举报
回复
谢谢大家,大家一起进步,谢谢大家,大家一起进步,谢谢大家,大家一起进步,谢谢大家,大家一起进步,
千里送人头 2019-03-28
  • 打赏
  • 举报
回复
看你函数内部的代码是怎么写的,数组名传进去,就是传的数组所对应的内存首地址,值是会改变的.
luomgen 2019-03-28
  • 打赏
  • 举报
回复
谢谢大家,大家一起进步,谢谢大家,大家一起进步,谢谢大家,大家一起进步,谢谢大家,大家一起进步,
真相重于对错 2019-03-27
  • 打赏
  • 举报
回复
引用 14 楼 Mr_sandman1994 的回复:
[quote=引用 11 楼 jiamianshiye_16_com 的回复:] 如果还是觉得有问题,你就把你的代码、运行环境、期望值,都贴出来。

 1 #include <stdio.h>
  2 #include <string.h>
  3 void func(char *pbuf)
  4 {
  5         *pbuf = “hello world”;//我这里是字符串
  6 }
  7 int main(int argc, char *argv[])
  8 {
  9         char a = 'a';
 10         func(&a);
 11         char b[1] = {'b'};
 12         func(b);
 13 
 14         printf("a:%c,b[]:%c\n", a, b[0]);
 15 
 16         return 0;
 17 }
[/quote] 错误的代码
绿色盒子 2019-03-27
  • 打赏
  • 举报
回复
引用 11 楼 jiamianshiye_16_com 的回复:
如果还是觉得有问题,你就把你的代码、运行环境、期望值,都贴出来。


1 #include <stdio.h>
2 #include <string.h>
3 void func(char *pbuf)
4 {
5 *pbuf = “hello world”;//我这里是字符串
6 }
7 int main(int argc, char *argv[])
8 {
9 char a = 'a';
10 func(&a);
11 char b[1] = {'b'};
12 func(b);
13
14 printf("a:%c,b[]:%c\n", a, b[0]);
15
16 return 0;
17 }
AlbertS 2019-03-27
  • 打赏
  • 举报
回复
就这种情况而言,两种方式都可以带回修改后的值,可以输出验证
真相重于对错 2019-03-27
  • 打赏
  • 举报
回复
引用 8 楼 Mr_sandman1994 的回复:
[quote=引用 6 楼 真相重于对错 的回复:] 已经改了,只不过要在调试窗口里面看到,你看的方式不对 你要么看b[0] 要么把b 声明为b[2]因为b在监视里是字符串,字符串要在监视里面正常显示,你要给它结尾添加一个'\0'
我试过加'\0'也不行啊,还是返回烫烫烫[/quote] char b[2] = { 'a' ,'\0'}; function(b);
jiamianshiye 2019-03-27
  • 打赏
  • 举报
回复
如果还是觉得有问题,你就把你的代码、运行环境、期望值,都贴出来。
jiamianshiye 2019-03-27
  • 打赏
  • 举报
回复


  1 #include <stdio.h>
  2 #include <string.h>
  3 void func(char *pbuf)
  4 {
  5         *pbuf = '1';
  6 }
  7 int main(int argc, char *argv[])
  8 {
  9         char a = 'a';
 10         func(&a);
 11         char b[1] = {'b'};
 12         func(b);
 13 
 14         printf("a:%c,b[]:%c\n", a, b[0]);
 15 
 16         return 0;
 17 }
~      
cdp@DESKTOP-3KBDDMU:~/code$ ./a.out 
a:1,b[]:1


绿色盒子 2019-03-27
  • 打赏
  • 举报
回复
引用 7 楼 jiamianshiye_16_com 的回复:
你的理解有误,字符串需要包含结束符,你说的‘返回’是有歧义的,因为你的函数声明为void类型,实际上传入的只有地址,跟类型无关。你的函数处理只不过是给这个地址指向的变量赋值,并不关心什么返回。

执行结束后,此地址指向的变量就会被赋值。

我知道啊,我问的就是为啥是数组地址的时候,数组的值没有变
绿色盒子 2019-03-27
  • 打赏
  • 举报
回复
引用 6 楼 真相重于对错 的回复:
已经改了,只不过要在调试窗口里面看到,你看的方式不对
你要么看b[0]
要么把b 声明为b[2]因为b在监视里是字符串,字符串要在监视里面正常显示,你要给它结尾添加一个'\0'

我试过加'\0'也不行啊,还是返回烫烫烫
jiamianshiye 2019-03-27
  • 打赏
  • 举报
回复
你的理解有误,字符串需要包含结束符,你说的‘返回’是有歧义的,因为你的函数声明为void类型,实际上传入的只有地址,跟类型无关。你的函数处理只不过是给这个地址指向的变量赋值,并不关心什么返回。 执行结束后,此地址指向的变量就会被赋值。
真相重于对错 2019-03-27
  • 打赏
  • 举报
回复
已经改了,只不过要在调试窗口里面看到,你看的方式不对 你要么看b[0] 要么把b 声明为b[2]因为b在监视里是字符串,字符串要在监视里面正常显示,你要给它结尾添加一个'\0'
加载更多回复(10)

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧