鱼C论坛

 找回密码
 立即注册
查看: 2948|回复: 9

如何调用函数进行数组赋值

[复制链接]
发表于 2017-1-3 16:38:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天写程序,偶然发现这个情况,虽然理解了指向问题,但解决不了赋值问题,该怎么弄?代码如下
#include <stdio.h>

void get (char * p);

void main()
{
        char ch[10];
        get(ch);
        puts(ch);
}

void get(char * p)
{
        p = "abcd";
}       
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-3 17:01:56 | 显示全部楼层
本帖最后由 代码农民 于 2017-1-3 17:28 编辑

我的理解是你在第二个函数里是想用缓存ch[10]的首地址直接指向字符串?
如果是这样:因为P是个临时的变量,在函数调用完p就没了(p是个中间量),而且ch[10]的首地址是不会变的,因为它是一个常量..
对于数组的赋值,有两种方法,一种是在声明的时候初始化赋值,如char a[]=" abcd ";另一种只能对元素一个一个的赋值,for(i = 0; i < N; ++i) a[ I ] =....
第二个函数可以这样改写:
void
get (char * p)

        char* s = "abcd"; //你想赋的值
       
        char* s1 ; //我们的变量工具

        for(s1 = s; *s1 != '\0'; ++s1)   //while( *p++ = *s1++ != '\0' );
                *p++ = *s1;                       //一个语句顶3句
        *p = '\0';                                      //要确宝数组空间够用
}

其实strcpy就是这样实现的:
原型 strcpy(目标数组首地址的副本, 你要赋的字符串);

       
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-3 18:51:23 | 显示全部楼层
本帖最后由 lzgw 于 2017-1-3 18:57 编辑
代码农民 发表于 2017-1-3 17:01
我的理解是你在第二个函数里是想用缓存ch[10]的首地址直接指向字符串?
如果是这样:因为P是个临时的变量 ...


你写的代码我明白,等于还是一个字符一个字符的放入p指向的地址里。

虽然p = “abcd” 不行,但是scanf(“%s”,p)却是可以的,strcpy(p, "abcd"); 这样也可以, 这是为什么呢?
字符串不能直接赋值,只能拷贝??

p= “abcd”   是改变指针的指向,而不是把字符串放入指针指向的地址中。
scanf(“%s”,p),strcpy(p, "abcd") 而这样却是把字符放入指针指向的地址中。

有没有什么方法能把“abcd”的地址放入指针指向的地址里呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-3 19:12:05 | 显示全部楼层
本帖最后由 代码农民 于 2017-1-3 19:36 编辑
lzgw 发表于 2017-1-3 18:51
还不是很明白,虽然p = “abcd” 不行,但是scanf(“%s”,p)却是可以的,strcpy(p, "abcd"); 这样也可 ...


调用scanf和strcpy会使字符串复制到p指向的内存空间。你想想,你要复制一个东西,总得有个空间容纳它吧....


对于scanf(“%s”,p)和strcpy(p, "abcd")来说,p是数组的首地址,也就是说在调用这两个函数之前必须确宝有个数组(安全的内存空间即缓冲区)能容纳你要复制的字符。
比如:char a[10];
         char *p = a; //p和数组的首地址相等
        然后才可以调用scanf(“%s”,p)和strcpy(p, "abcd"),字符会被复制到p指向的数组里

如果没有设置缓冲区,即只有char *p; p的指向的空间是不确定的(比如可能指向有用的数据),调用函数会破坏它们....

不知道我说的你能不能理解...不理解可以再问我..真不行就加好友语音

补冲:
对于scanf(“%s”,p);其实函数原型里肯定做了不少工作,它也肯定不是整体赋值的,只是咱们看不见.函数到底作了些什么..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-3 20:38:18 | 显示全部楼层
代码农民 发表于 2017-1-3 19:12
调用scanf和strcpy会使字符串复制到p指向的内存空间。你想想,你要复制一个东西,总得有个空间容纳它吧 ...

感谢答复,我再研究研究。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-3 20:39:19 | 显示全部楼层
lzgw 发表于 2017-1-3 20:38
感谢答复,我再研究研究。

Q:690549170
反正我也闲着没事...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-3 20:49:58 From FishC Mobile | 显示全部楼层
代码农民 发表于 2017-1-3 19:12
调用scanf和strcpy会使字符串复制到p指向的内存空间。你想想,你要复制一个东西,总得有个空间容纳它吧 ...

级别太低,加不了好友,加微信可以不,我微信号14907583
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-3 20:51:07 | 显示全部楼层
lzgw 发表于 2017-1-3 20:49
级别太低,加不了好友,加微信可以不,我微信号14907583

我加你吧,给个Q号,因为我不太会微信....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-15 22:30:29 | 显示全部楼层
本帖最后由 fc1735 于 2017-1-15 22:32 编辑

可以用sprintf 函数解决
void get(char* p)
{
      sprintf(p,"%s","abcd");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-4 14:54:33 | 显示全部楼层
代码农民 发表于 2017-1-3 17:01
我的理解是你在第二个函数里是想用缓存ch[10]的首地址直接指向字符串?
如果是这样:因为P是个临时的变量 ...

解释的好!学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 19:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表