丘陵山地 发表于 2022-7-25 21:15:34

c语言二级,结构体的替换,救救孩子吧

#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 恭喜您答对了!
【题目解析】
本题的考查点是结构体的运用。本题定义了两个结构体变量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函数之后不应该被替换了吗{:10_319:}



人造人 发表于 2022-7-25 21:38:53

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


f函数这样写是无法修改变量p指向的字符串的
C语言函数调用的参数是值传递,就是把这个变量复制一份然后传递给函数
指针要解引用才能修改调用者传递过来的变量

人造人 发表于 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;
}

丘陵山地 发表于 2022-7-25 21:49:25

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

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

丘陵山地 发表于 2022-7-25 21:53:13

人造人 发表于 2022-7-25 21:44


哇塞,谢谢大佬,太感动了{:5_100:}

人造人 发表于 2022-7-25 21:55:49

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

学编程的第一件很重要的事是 把代码写好,代码格式真的很重要
学了一遍C语言后,就先学汇编语言,然后再学一遍C语言

人造人 发表于 2022-7-25 21:58:20

毕竟你是想要学好C语言
要学好C语言你就必须能够从汇编语言的角度看C语言

丘陵山地 发表于 2022-7-25 21:58:31

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

嗯嗯,以后准备看一下小甲鱼的汇编{:5_109:}

丘陵山地 发表于 2022-7-25 22:00:06

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

谢谢大佬,C语言引路人{:10_298:}

人造人 发表于 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;
}

丘陵山地 发表于 2022-7-25 22:05:30

人造人 发表于 2022-7-25 22:02
另外,值得一提的是这个代码,我注释掉了第20行

好嘞好嘞,我仔细研究一下{:10_323:}

丘陵山地 发表于 2022-8-28 08:58:48

人造人 发表于 2022-7-25 21:44


时隔一个月我又看不懂了
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");
}}

人造人 发表于 2022-8-28 12:52:35

丘陵山地 发表于 2022-8-28 08:58
时隔一个月我又看不懂了
void f(char **p)
{


因为p的类型是 char **
所以 *p 的值是一个地址
*p是一个地址,可以把*p的值传给strcpy
**p的值就是一个字符了
指针没学好?学了汇编语言以后再学一遍C语言试试

丘陵山地 发表于 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;,难道是真的可以这样?

丘陵山地 发表于 2022-8-29 10:31:49

丘陵山地 发表于 2022-8-29 10:29
strcpy函数不就是字符串传给另一个字符串吗?

void f(char **p)


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

这个地址空间就是指针吗

丘陵山地 发表于 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, c[] = "I am a teacher!";
        strcpy(a, c);
        printf(" c=%s\n", c);
        printf(" a=%s\n", a);

}

那像这种我又咋理解呢,c[]是字符串,a是地址,也相当于指针??

人造人 发表于 2022-8-29 10:54:01

丘陵山地 发表于 2022-8-29 10:34
#include
#include
void main()


a和c都是地址

丘陵山地 发表于 2022-8-29 11:23:03

人造人 发表于 2022-8-29 10:54
a和c都是地址

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

人造人 发表于 2022-8-29 11:24:15

丘陵山地 发表于 2022-8-29 11:23
void f(char **p)
{
    *p = (char *)malloc(10);


"Qian" 是地址
是 const char * 类型的地址

丘陵山地 发表于 2022-8-30 09:23:49

人造人 发表于 2022-8-29 11:24
"Qian" 是地址
是 const char * 类型的地址

谢谢大佬,我现在有点明白了{:10_323:}
页: [1]
查看完整版本: c语言二级,结构体的替换,救救孩子吧