但求过程001 发表于 2025-12-4 22:17:54

指针变量作函数参数

#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;

}


我可能是越学越混乱了,这个程序理应很简单,但是为什么运行后得不到正确结果,我又不知道哪里错了~~

FishC 发表于 2025-12-4 22:18:47

指针变量作函数参数

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

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

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

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


#include <stdio.h>

// 比较函数,接收两个整数指针,返回较大的值
int compare(int *p1, int *p2) {
    if (*p1 > *p2) {
      return *p1;// 返回 p1 指向的值
    } else {
      return *p2;// 返回 p2 指向的值
    }
}

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

    point1 = &a;// point1 指向 a
    point2 = &b;// point2 指向 b

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

    return 0;
}


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

但求过程001 发表于 2025-12-4 22:22:30

FishC 发表于 2025-12-4 22:18
指针变量作函数参数

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

scanf()的函数我有个符号用错了,我没注意,已经运行成功了

FishC 发表于 2025-12-4 22:22:47

但求过程001 发表于 2025-12-04 22:22
FishC 发表于 2025-12-4 22:18
指针变量作函数参数
...

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

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

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

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

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

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

int compare(const int *p1, const int *p2) {
    // 函数体内不能通过 p1 或 p2 修改所指向的数据
}


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

不二如是 发表于 2025-12-5 10:49:54

宝子觉得“越学越混乱”的原因:

其实C语言最容易犯错的地方就是 scanf、指针、格式化输入输出。你的逻辑是正确的,只是一个小小的格式串错误导致输入读取失败。
代码有些需要提高的地方{:13_444:}

1、scanf 的格式串写错了

你写的是:

scanf("&d,%d",&a,&b);
但正确写法应该是:

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

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

你定义了:

int compare(int *p1,int *p2)
{
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}
虽然你没有 return 值,但 main 里也没有使用返回值,所以功能上不影响运行结果,不过更规范的写法应该是:

void compare(int *p1,int *p2)
否则编译器可能会给出 warning。

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

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

int main()
{
    int a, b;
    int *point1, *point2;

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

    point1 = &a;
    point2 = &b;

    if(a < b)
    {
      compare(point1, point2);
    }

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

    return 0;
}

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

页: [1]
查看完整版本: 指针变量作函数参数