lzgw 发表于 2017-1-3 16:38:58

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

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

void get (char * p);

void main()
{
        char ch;
        get(ch);
        puts(ch);
}

void get(char * p)
{
        p = "abcd";
}       

代码农民 发表于 2017-1-3 17:01:56

本帖最后由 代码农民 于 2017-1-3 17:28 编辑

我的理解是你在第二个函数里是想用缓存ch的首地址直接指向字符串?
如果是这样:因为P是个临时的变量,在函数调用完p就没了(p是个中间量),而且ch的首地址是不会变的,因为它是一个常量..
对于数组的赋值,有两种方法,一种是在声明的时候初始化赋值,如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(目标数组首地址的副本, 你要赋的字符串);

       

lzgw 发表于 2017-1-3 18:51:23

本帖最后由 lzgw 于 2017-1-3 18:57 编辑

代码农民 发表于 2017-1-3 17:01
我的理解是你在第二个函数里是想用缓存ch的首地址直接指向字符串?
如果是这样:因为P是个临时的变量 ...

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

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

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

有没有什么方法能把“abcd”的地址放入指针指向的地址里呢?

代码农民 发表于 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;
         char *p = a; //p和数组的首地址相等
      然后才可以调用scanf(“%s”,p)和strcpy(p, "abcd"),字符会被复制到p指向的数组里

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

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

补冲:
对于scanf(“%s”,p);其实函数原型里肯定做了不少工作,它也肯定不是整体赋值的,只是咱们看不见.函数到底作了些什么..

lzgw 发表于 2017-1-3 20:38:18

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

感谢答复,我再研究研究。

代码农民 发表于 2017-1-3 20:39:19

lzgw 发表于 2017-1-3 20:38
感谢答复,我再研究研究。

Q:690549170
反正我也闲着没事...

lzgw 发表于 2017-1-3 20:49:58

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

级别太低,加不了好友,加微信可以不,我微信号14907583

代码农民 发表于 2017-1-3 20:51:07

lzgw 发表于 2017-1-3 20:49
级别太低,加不了好友,加微信可以不,我微信号14907583

我加你吧,给个Q号,因为我不太会微信....

fc1735 发表于 2017-1-15 22:30:29

本帖最后由 fc1735 于 2017-1-15 22:32 编辑

可以用sprintf 函数解决

void get(char* p)
{
      sprintf(p,"%s","abcd");
}

mhp0114 发表于 2017-2-4 14:54:33

代码农民 发表于 2017-1-3 17:01
我的理解是你在第二个函数里是想用缓存ch的首地址直接指向字符串?
如果是这样:因为P是个临时的变量 ...

解释的好!学习了
页: [1]
查看完整版本: 如何调用函数进行数组赋值