指针变量作函数参数
#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;
}
我可能是越学越混乱了,这个程序理应很简单,但是为什么运行后得不到正确结果,我又不知道哪里错了~~ 指针变量作函数参数
指针作为函数参数的主要作用是允许函数直接修改调用者中的变量,或者高效地传递大型数据结构的地址。通过传递指针,函数可以访问和操作原始数据,而不是数据的副本。
在你的代码中,有几个需要修正的地方:
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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2025-12-4 22:18
指针变量作函数参数
指针作为函数参数的主要作用是允许函数直接修改调用者中的变量,或者高效地传递大型 ...
scanf()的函数我有个符号用错了,我没注意,已经运行成功了 但求过程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 小助理,如未能正确解答您的问题,请继续追问。 宝子觉得“越学越混乱”的原因:
其实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]