如何用指针实现scan_card函数向play_card返回三个输入数值?
用指针/数组实现多值回传的解决方案
嘿,我来帮你搞定这个问题~先看看你代码里的几个小问题:
- 函数调用写错啦:
play_scanner(card_array)应该是scan_card(card_array) scan_card里的card_one、card_two、card_three根本没声明,编译器肯定会报错- 你定义的
card_array[] = {0}只有1个元素的空间,完全存不下3个整数呀
接下来给你两种可行的实现方式,选哪种看你代码的结构需求:
方式一:用数组传递(推荐,适合批量数据)
这种方式直接把能装下3个整数的数组传给scan_card,在函数里直接给数组元素赋值,调用方play_card就能直接拿到结果。
修正后的完整代码:
#include <stdio.h> // 别忘了加这个头文件,scanf依赖它 void play_card(void) { // 定义一个能存3个整数的数组 int card_array[3]; // 调用scan_card,数组名本身就是指向首元素的指针,直接传就行 scan_card(card_array); // 现在就能用这三个值啦 printf("拿到的三张牌:%d, %d, %d\n", card_array[0], card_array[1], card_array[2]); } // 扫描用户输入的三个数字,存入传入的数组 void scan_card(int card_array[]) { // 直接给数组元素赋值,因为card_array指向play_card里数组的首元素 scanf("%d %d %d", &card_array[0], &card_array[1], &card_array[2]); } // 测试用的主函数 int main() { play_card(); return 0; }
为啥这么写能行?
- 数组名作为参数传递时,会自动退化为指向第一个元素的指针,所以
scan_card里操作card_array[0],其实就是在修改play_card里数组的第一个元素,相当于直接把值写回去了 - 一定要保证数组有足够的空间,这里定义
int card_array[3]刚好能装3个整数
方式二:用三个独立的指针参数
如果你想保留play_card里的三个单独变量(card_one、card_two、card_three),那可以把这三个变量的地址传给scan_card,通过指针直接修改它们的值。
代码示例:
#include <stdio.h> void play_card(void) { int card_one, card_two, card_three; // 用&取变量的地址,把地址传给scan_card的指针参数 scan_card(&card_one, &card_two, &card_three); printf("拿到的三张牌:%d, %d, %d\n", card_one, card_two, card_three); } // 接收三个int类型的指针,通过指针修改原变量的值 void scan_card(int *p1, int *p2, int *p3) { scanf("%d %d %d", p1, p2, p3); // 这里不用加&哦,因为p1本身就是地址,scanf要的就是变量的内存地址 } int main() { play_card(); return 0; }
这个逻辑也很简单:
&card_one拿到card_one的内存地址,把这个地址给scan_card里的p1指针,p1就指向play_card里的card_one了- 调用
scanf时直接传p1,就是把输入的值写到p1指向的内存空间,也就是直接修改了play_card里的card_one变量
这两种方式都能完美实现你要的“把三个数值传递回play_card函数”的需求,你可以根据自己的代码结构选合适的~
内容的提问来源于stack exchange,提问作者Zoey Malkov
相关产品推荐
相关产品推荐

