第44课结构体函数问题
1.为什么如果要用struct Book Input(struct Book book)还要为struct Book b1 ;b1 = Input(b1)不能用void Book Input(struct Book book)直接改变结构体内部的变量吗?
2.结构体变量中的变量是依据定义的位置来规定作用域的吗? 1.不能
2.不知道你在说什么
3.我看不到你的电脑屏幕上的代码,所以需要你把代码复制上来 人造人 发表于 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 07:56
#include
struct Book
C语言按值传递参数
input(book);
这样会复制一份book然后传递给input函数,input函数内部不管做什么也无法改变main函数中的book
人造人 发表于 2019-10-6 08:47
C语言按值传递参数
input(book);
这样会复制一份book然后传递给input函数,input函数内部不管做什么也 ...
那这个函数不算对地址直接放入数据吗?还是说此时函数中的book是局部变量 水深 发表于 2019-10-6 11:56
那这个函数不算对地址直接放入数据吗?还是说此时函数中的book是局部变量
说不能就是不能,没有商量的余地,现在你只要记住这个不能就可以了,我知道你渴望弄懂原理,我知道你想知道为什么不能,但是还不是时候,因为你不懂汇编语言(应该是吧,如果你懂汇编语言,那就简单了)
这些底层的东西需要用汇编语言解释 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 #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> 看23行到26行,复制了book #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;
}
你可以学习一下传值和传址的区别
页:
[1]