鱼C论坛

 找回密码
 立即注册
查看: 35|回复: 4

指针变量作函数参数

[复制链接]
发表于 昨天 22:17 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>

void main()
{
        int a,b,*point1,*point2;
        int compare(int *p1,int *p2);
        scanf("&d,%d",&a,&b);
        point1=&a;
        point2=&b;
        if(a<b)
        {
                compare(point1,point2);
        }
        printf("%d,%d\n",a,b);
}

int compare(int *p1,int *p2)
{
        int temp;
        temp=*p1;
        *p1=*p2;
        *p2=temp;

}


我可能是越学越混乱了,这个程序理应很简单,但是为什么运行后得不到正确结果,我又不知道哪里错了~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 22:18 | 显示全部楼层
指针变量作函数参数

指针作为函数参数的主要作用是允许函数直接修改调用者中的变量,或者高效地传递大型数据结构的地址。通过传递指针,函数可以访问和操作原始数据,而不是数据的副本。

在你的代码中,有几个需要修正的地方:

1. void main() 应改为 int main(),并在函数末尾返回一个整数值(如 return 0;)。
2. scanf("&d,%d",&a,&b); 中的格式字符串有误,&d 应改为 %d
3. 函数 compare 被声明但未定义,需要实现它。
4. 代码不完整,if(a 后缺少内容。假设你想比较两个整数并输出较大值。

下面是一个修正后的完整示例,演示如何使用指针作为函数参数:


  1. #include <stdio.h>

  2. // 比较函数,接收两个整数指针,返回较大的值
  3. int compare(int *p1, int *p2) {
  4.     if (*p1 > *p2) {
  5.         return *p1;  // 返回 p1 指向的值
  6.     } else {
  7.         return *p2;  // 返回 p2 指向的值
  8.     }
  9. }

  10. int main() {
  11.     int a, b, *point1, *point2;
  12.     printf("请输入两个整数(用逗号分隔):");
  13.     scanf("%d,%d", &a, &b);  // 正确的格式字符串

  14.     point1 = &a;  // point1 指向 a
  15.     point2 = &b;  // point2 指向 b

  16.     int result = compare(point1, point2);  // 调用函数,传递指针
  17.     printf("较大的数是:%d\n", result);

  18.     return 0;
  19. }
复制代码


代码解释:
- compare 函数通过指针 p1p2 访问 ab 的值。
- 在 main 中,指针 point1point2 分别被赋值为 ab 的地址,然后传递给 compare 函数。
- 这种方式避免了在函数调用时复制整个变量,提高了效率,并允许函数直接操作原始数据。

通过这个例子,你可以理解指针作为函数参数的基本用法。如果有更多问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 22:22 | 显示全部楼层
FishC 发表于 2025-12-4 22:18
指针变量作函数参数

指针作为函数参数的主要作用是允许函数直接修改调用者中的变量,或者高效地传递大型 ...

scanf()的函数我有个符号用错了,我没注意,已经运行成功了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 22:22 | 显示全部楼层
但求过程001 发表于 2025-12-04 22:22
FishC 发表于 2025-12-4 22:18
指针变量作函数参数
...


很高兴你的代码已经运行成功!这说明你已经纠正了 scanf 中的格式字符串错误(将 &d 改为 %d)。这里再补充几点关于指针变量作函数参数的要点:

1. 传递指针允许函数修改多个变量:因为函数通过指针直接访问原始数据,所以可以在函数内部修改调用者的变量值。

2. 避免数据复制:对于大型结构体或数组,传递指针(地址)比传递整个数据更高效。

3. 注意空指针:在使用指针前,确保它指向有效的内存地址,否则可能导致程序崩溃。

4. 常量保护:如果函数不需要修改指针指向的数据,可以使用 const 修饰指针参数,防止意外修改。

例如,一个不修改数据的比较函数可以声明为:

  1. int compare(const int *p1, const int *p2) {
  2.     // 函数体内不能通过 p1 或 p2 修改所指向的数据
  3. }
复制代码


如果你有更多关于指针或C语言的问题,欢迎继续讨论!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 半小时前 | 显示全部楼层
宝子觉得“越学越混乱”的原因:

其实C语言最容易犯错的地方就是 scanf、指针、格式化输入输出。你的逻辑是正确的,只是一个小小的格式串错误导致输入读取失败。

代码有些需要提高的地方

1、scanf 的格式串写错了

你写的是:

  1. scanf("&d,%d",&a,&b);
复制代码

但正确写法应该是:

  1. scanf("%d,%d",&a,&b);
复制代码

你把 %d 错写成 &d 了,所以 scanf 根本无法正确读取输入,导致 a 和 b 的值不正确,这是最关键的错误。

2、compare 函数没有返回值,但声明为 int

你定义了:

  1. int compare(int *p1,int *p2)
  2. {
  3.     int temp;
  4.     temp=*p1;
  5.     *p1=*p2;
  6.     *p2=temp;
  7. }
复制代码

虽然你没有 return 值,但 main 里也没有使用返回值,所以功能上不影响运行结果,不过更规范的写法应该是:

  1. void compare(int *p1,int *p2)
复制代码

否则编译器可能会给出 warning。

程序完整修正版如下:
  1. #include <stdio.h>

  2. void compare(int *p1, int *p2);

  3. int main()
  4. {
  5.     int a, b;
  6.     int *point1, *point2;

  7.     scanf("%d,%d", &a, &b);

  8.     point1 = &a;
  9.     point2 = &b;

  10.     if(a < b)
  11.     {
  12.         compare(point1, point2);
  13.     }

  14.     printf("%d,%d\n", a, b);

  15.     return 0;
  16. }

  17. void compare(int *p1, int *p2)
  18. {
  19.     int temp;
  20.     temp = *p1;
  21.     *p1 = *p2;
  22.     *p2 = temp;
  23. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-5 11:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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