水深 发表于 2019-10-5 19:13:20

第44课结构体函数问题

1.为什么如果要用struct Book Input(struct Book book)还要为struct Book b1 ;b1 = Input(b1)
不能用void Book Input(struct Book book)直接改变结构体内部的变量吗?
2.结构体变量中的变量是依据定义的位置来规定作用域的吗?

人造人 发表于 2019-10-5 20:58:01

1.不能
2.不知道你在说什么
3.我看不到你的电脑屏幕上的代码,所以需要你把代码复制上来

水深 发表于 2019-10-6 07:56:54

人造人 发表于 2019-10-5 20:58
1.不能
2.不知道你在说什么
3.我看不到你的电脑屏幕上的代码,所以需要你把代码复制上来

#include <stdio.h>

struct Book
{
    int a;
    int b;
};

void input(struct Book book);

void input(struct Book book)
{
    scanf("%d",&book.a);
    scanf("%d",&book.b);
    return book;
}

int main()
{
    struct Book book;
    input(book);
    printf("%d\n%d\n",book.a,book.b);
    return 0;
}

人造人 发表于 2019-10-6 08:47:39

水深 发表于 2019-10-6 07:56
#include

struct Book


C语言按值传递参数
input(book);
这样会复制一份book然后传递给input函数,input函数内部不管做什么也无法改变main函数中的book

水深 发表于 2019-10-6 11:56:57

人造人 发表于 2019-10-6 08:47
C语言按值传递参数
input(book);
这样会复制一份book然后传递给input函数,input函数内部不管做什么也 ...

那这个函数不算对地址直接放入数据吗?还是说此时函数中的book是局部变量

人造人 发表于 2019-10-6 13:29:28

水深 发表于 2019-10-6 11:56
那这个函数不算对地址直接放入数据吗?还是说此时函数中的book是局部变量

说不能就是不能,没有商量的余地,现在你只要记住这个不能就可以了,我知道你渴望弄懂原理,我知道你想知道为什么不能,但是还不是时候,因为你不懂汇编语言(应该是吧,如果你懂汇编语言,那就简单了)
这些底层的东西需要用汇编语言解释

人造人 发表于 2019-10-6 13:34:35

int main()
{
00F71D40push      ebp
00F71D41mov         ebp,esp
00F71D43sub         esp,0D4h
00F71D49push      ebx
00F71D4Apush      esi
00F71D4Bpush      edi
00F71D4Clea         edi,
00F71D52mov         ecx,35h
00F71D57mov         eax,0CCCCCCCCh
00F71D5Crep stos    dword ptr es:
00F71D5Emov         eax,dword ptr
00F71D63xor         eax,ebp
00F71D65mov         dword ptr ,eax
00F71D68mov         ecx,offset _2F8C462B_main@c (0F7C003h)
00F71D6Dcall      @__CheckForDebuggerJustMyCode@4 (0F71226h)
        struct Book book = {0};
00F71D72xor         eax,eax
00F71D74mov         dword ptr ,eax
00F71D77mov         dword ptr ,eax
        book = input(book);
00F71D7Amov         eax,dword ptr
00F71D7Dpush      eax
00F71D7Emov         ecx,dword ptr
00F71D81push      ecx
00F71D82call      _input (0F713ACh)
00F71D87add         esp,8
00F71D8Amov         dword ptr ,eax
00F71D8Dmov         dword ptr ,edx
        printf("%d\n%d\n", book.a, book.b);
00F71D90mov         eax,dword ptr
00F71D93push      eax
00F71D94mov         ecx,dword ptr
00F71D97push      ecx
00F71D98push      offset string "%d\n%d\n" (0F77B34h)
00F71D9Dcall      _printf (0F7104Bh)
00F71DA2add         esp,0Ch
        return 0;
00F71DA5xor         eax,eax
}
00F71DA7push      edx
00F71DA8mov         ecx,ebp
00F71DAApush      eax
00F71DABlea         edx,ds:
00F71DB1call      @_RTC_CheckStackVars@8 (0F7125Dh)
00F71DB6pop         eax
00F71DB7pop         edx
00F71DB8pop         edi
00F71DB9pop         esi
00F71DBApop         ebx
00F71DBBmov         ecx,dword ptr
00F71DBExor         ecx,ebp
00F71DC0call      @__security_check_cookie@4 (0F711F9h)
00F71DC5add         esp,0D4h
00F71DCBcmp         ebp,esp
00F71DCDcall      __RTC_CheckEsp (0F71230h)
00F71DD2mov         esp,ebp
00F71DD4pop         ebp
00F71DD5ret

bin554385863 发表于 2019-10-6 13:35:22

#include <stdio.h>

struct Book
{
    int a;
    int b;
};
void input(struct Book *book)//改用指针作为参数
{
    scanf("%d",&book->a);
    scanf("%d",&book->b);
}
int main()
{
    struct Book book;
    printf("请输入数据\n");
    input(&book);
    printf("你输入的数据是:\n%d\n%d\n",book.a,book.b);
    return 0;
}
-----------------------------------------------------------------------------------
E:\Users\86184\Documents\Code>c:\Users\86184\.vscode\extensions\ms-vscode.cpptools-0.25.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-5g1tquq0.mcn --stdout=Microsoft-MIEngine-Out-5ygvovav.tue --stderr=Microsoft-MIEngine-Error-dngse442.icy --pid=Microsoft-MIEngine-Pid-s54itlyr.mq0 "--dbgExe=E:\My Program\MinGW\bin\gdb.exe" --interpreter=mi
请输入数据
200
300
你输入的数据是:
200
300

E:\Users\86184\Documents\Code>

人造人 发表于 2019-10-6 13:35:22

看23行到26行,复制了book

人造人 发表于 2019-10-6 13:36:33

#include <stdio.h>

struct Book
{
        int a;
        int b;
};

struct Book input(struct Book book)
{
        scanf("%d", &book.a);
        scanf("%d", &book.b);
        return book;
}

int main()
{
        struct Book book = {0};
        book = input(book);
        printf("%d\n%d\n", book.a, book.b);
        return 0;
}

bin554385863 发表于 2019-10-6 14:05:43

你可以学习一下传值和传址的区别
页: [1]
查看完整版本: 第44课结构体函数问题