鱼C论坛

 找回密码
 立即注册
查看: 2462|回复: 19

[已解决]c语言二级,结构体的替换,救救孩子吧

[复制链接]
发表于 2022-7-25 21:15:34 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef struct stu

{

char *name,gender;

int score;

} STU;

void f(char*p)

{

p=(char *)malloc(10) ;

strcpy(p,"Qian");

}

main()

{

STU a={NULL,'m’', 290} ,b;

a.name=(char *)malloc(10);

strcpy ( a.name,"Zhao");

b = a;

f(b.name);

b.gender = 'f’ ; b.score = 350;

printf("%s,%c, %d,",a. name,a.gender,a.score) ;

printf("%s,%c,%d\n", b.name,b.gender,b.score) ;

}

则程序的输出结果是( )。



A. Zhao,m,290,Qian,f,350

B. Zhao,m, 290, Zhao,f,350

C. Qian,f,350,Qian, f, 350

D. Qian, m,290,Qian,f[逗号 ]350

【您的选择】B 恭喜您答对了!  
【题目解析】
本题的考查点是结构体的运用[/code]。本题定义了两个结构体变量a和b,并为a赋予了新值;语句b=a是将结构体变量a的内容赋给了结构体变量b,对于结构体的赋值,意味着将其中的每一个元素都进行赋值,执行f (b.name)时,调用f函数,在f函数体中给p开辟了一个新的空间,在新的空间里的*p=Qian,但对主函数无任何影响,语句又为b中的gender和score元素赋予了新值,b.gender = 'f’; b.score = 350 ; 。故本题答案为B。


我选的A。经过f函数之后不应该被替换了吗



最佳答案
2022-7-25 21:38:53
哇,这代码格式
兄弟你想学会C语言吗?把代码写成这样是学不会C语言的
如果不想学会C语言,只是想要通过考试的话那问题就简单了
直接背答案就可以了,你管他什么原理了,背过就能考过,就是这样


f函数这样写是无法修改变量p指向的字符串的
C语言函数调用的参数是值传递,就是把这个变量复制一份然后传递给函数
指针要解引用才能修改调用者传递过来的变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-25 21:38:53 | 显示全部楼层    本楼为最佳答案   
哇,这代码格式
兄弟你想学会C语言吗?把代码写成这样是学不会C语言的
如果不想学会C语言,只是想要通过考试的话那问题就简单了
直接背答案就可以了,你管他什么原理了,背过就能考过,就是这样


f函数这样写是无法修改变量p指向的字符串的
C语言函数调用的参数是值传递,就是把这个变量复制一份然后传递给函数
指针要解引用才能修改调用者传递过来的变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-25 21:44:13 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct stu {
    char *name;
    char gender;
    int score;
} STU;

/*
void f(char *p) {
    p = (char *)malloc(10);
    strcpy(p, "Qian");
}
*/

//void f(char *p) {
void f(char **p) {
    *p = (char *)malloc(10);
    strcpy(*p, "Qian");
}

// main()
int main(void) {
    //STU a = {NULL, 'm’', 290}, b;
    STU a = {NULL, 'm', 290}, b;
    a.name = (char *)malloc(10);

    strcpy(a.name, "Zhao");

    b = a;

    f(&b.name);

    //b.gender = 'f’ ; b.score = 350;
    b.gender = 'f';
    b.score = 350;

    printf("%s,%c, %d,", a.name, a.gender, a.score);
    printf("%s,%c,%d\n", b.name, b.gender, b.score);

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

使用道具 举报

 楼主| 发表于 2022-7-25 21:49:25 | 显示全部楼层
人造人 发表于 2022-7-25 21:38
哇,这代码格式
兄弟你想学会C语言吗?把代码写成这样是学不会C语言的
如果不想学会C语言,只是想要通过 ...

大学不是c语言编程的相关专业,完全就是兴趣,我有个初中同学在学单片机,有一次同学聚会了解到了,他还给了我些单片机和些模块,我就想学学c语言,感觉单片机很好玩,然后在学校又没多少时间学,都是寒暑假,去年寒假和今年暑假在学,报了个c语言考试,鞭策一下自己。寒假把小甲鱼的远古c语言视频看了一遍,知道了一下简单的语法知识,这个暑假继续学,看书,刷二级题。想先定个底子,以后工作了,稳定了再来慢慢学,当个爱好也不错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-25 21:53:13 | 显示全部楼层

哇塞,谢谢大佬,太感动了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-25 21:55:49 | 显示全部楼层
丘陵山地 发表于 2022-7-25 21:49
大学不是c语言编程的相关专业,完全就是兴趣,我有个初中同学在学单片机,有一次同学聚会了解 ...

学编程的第一件很重要的事是 把代码写好,代码格式真的很重要
学了一遍C语言后,就先学汇编语言,然后再学一遍C语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-7-25 21:58:20 | 显示全部楼层
毕竟你是想要学好C语言
要学好C语言你就必须能够从汇编语言的角度看C语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-25 21:58:31 | 显示全部楼层
人造人 发表于 2022-7-25 21:55
学编程的第一件很重要的事是 把代码写好,代码格式真的很重要
学了一遍C语言后,就先学汇编语言,然后再 ...

嗯嗯,以后准备看一下小甲鱼的汇编
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-25 22:00:06 | 显示全部楼层
人造人 发表于 2022-7-25 21:55
学编程的第一件很重要的事是 把代码写好,代码格式真的很重要
学了一遍C语言后,就先学汇编语言,然后再 ...

谢谢大佬,C语言引路人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-25 22:02:31 | 显示全部楼层
另外,值得一提的是这个代码,我注释掉了第20行
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct stu {
    char *name;
    char gender;
    int score;
} STU;

/*
void f(char *p) {
    p = (char *)malloc(10);
    strcpy(p, "Qian");
}
*/

//void f(char *p) {
void f(char **p) {
    //*p = (char *)malloc(10);
    strcpy(*p, "Qian");
}

// main()
int main(void) {
    //STU a = {NULL, 'm’', 290}, b;
    STU a = {NULL, 'm', 290}, b;
    a.name = (char *)malloc(10);

    strcpy(a.name, "Zhao");

    b = a;

    f(&b.name);

    //b.gender = 'f’ ; b.score = 350;
    b.gender = 'f';
    b.score = 350;

    printf("%s,%c, %d,", a.name, a.gender, a.score);
    printf("%s,%c,%d\n", b.name, b.gender, b.score);

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

使用道具 举报

 楼主| 发表于 2022-7-25 22:05:30 | 显示全部楼层
人造人 发表于 2022-7-25 22:02
另外,值得一提的是这个代码,我注释掉了第20行

好嘞好嘞,我仔细研究一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-28 08:58:48 | 显示全部楼层

时隔一个月我又看不懂了
void f(char **p)
{
    *p = (char *)malloc(10);
    strcpy(*p, "Qian");
}

其中strcpy(*p, "Qian")。*p不是一个地址吗,还能把值传给地址吗?不应该是strcpy(**p, "Qian")。我晕了。指针没学好T_T

那岂不是可以写成
void f(char *p)
{
    p = (char *)malloc(10);
    strcpy(*p, "Qian");
}}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-28 12:52:35 | 显示全部楼层
丘陵山地 发表于 2022-8-28 08:58
时隔一个月我又看不懂了
void f(char **p)
{

因为p的类型是 char **
所以 *p 的值是一个地址
*p是一个地址,可以把*p的值传给strcpy
**p的值就是一个字符了
指针没学好?学了汇编语言以后再学一遍C语言试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-29 10:29:41 | 显示全部楼层
人造人 发表于 2022-8-28 12:52
因为p的类型是 char **
所以 *p 的值是一个地址
*p是一个地址,可以把*p的值传给strcpy

strcpy函数不就是字符串传给另一个字符串吗?

void f(char **p)
{
    *p = (char *)malloc(10);
    strcpy(*p, "Qian");//这里*p是地址,Qian是字符串,字符串还可以替换地址???用Qian去替换0x1133?
}

我在网上也没搜到strcpy与指针的用法,T-T&#128555;,难道是真的可以这样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-29 10:31:49 | 显示全部楼层
丘陵山地 发表于 2022-8-29 10:29
strcpy函数不就是字符串传给另一个字符串吗?

void f(char **p)

strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。

这个地址空间就是指针吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-29 10:34:22 | 显示全部楼层
丘陵山地 发表于 2022-8-29 10:31
strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地 ...

#include<string.h>
#include <stdio.h>
void main()
{
        char a[20], c[] = "I am a teacher!";
        strcpy(a, c);
        printf(" c=%s\n", c);
        printf(" a=%s\n", a);

}

那像这种我又咋理解呢,c[]是字符串,a[20]是地址,也相当于指针??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-29 10:54:01 | 显示全部楼层
丘陵山地 发表于 2022-8-29 10:34
#include
#include
void main()

a和c都是地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-29 11:23:03 | 显示全部楼层

void f(char **p)
{
    *p = (char *)malloc(10);
    strcpy(*p, "Qian");//这里*p是地址,Qian是字符串,字符串还可以替换地址???用Qian去替换0x1133?
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-29 11:24:15 | 显示全部楼层
丘陵山地 发表于 2022-8-29 11:23
void f(char **p)
{
    *p = (char *)malloc(10);

"Qian" 是地址
是 const char * 类型的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-30 09:23:49 | 显示全部楼层
人造人 发表于 2022-8-29 11:24
"Qian" 是地址
是 const char * 类型的地址

谢谢大佬,我现在有点明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-27 22:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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