一个c语言函数的基础问题

我的函数有什么问题吗??目前add函数完全不运作,i该是1还是1int main(){int i;i = 1;void add(int i);add(i);printf("%d", i);}void add(int i){i++;}

第1个回答  2019-05-10

因为add方法的变量是按值传递的, 你有没有让他返回结果, 所以i的值在add外面是不发生变化的

两种改法

    使用返回值

int add(int i)
{
    i++;
    return i;
}

// main里的调用改成
i = add(i);

2. 使用指针

void add(int* i)
{
    (*i)++;
}
// main里调用改成
add(&i);

main里的函数声明也要做相应的修改

追问

我看懂了你的两种方法,有没有简单点的方法能让实现让 我定义的函数 是主函数的一部分?

比如我本来要在主函数中定义一个交换函数,形参是两个值,我不知道怎么输出。

它长这样

我发现我的函数根本不起作用,于是做了那个add函数看了下,发现确实编的函数没用,我前几天编的函数既不用返回值,也能发挥作用,是我哪里出了问题?

追答

你后发的这个也不会交换啊, 你要在别的方法里进行交换, 要么提升变量作用域(比如全局变量), 要么使用返回值, 要么使用指针. 使用指针包含数组的范畴

如果你用的是C++的话, 只需要把你写的那个方法的参数变成引用参数就行了, 只是函数签名有变化, 其他代码不动:

void exec (int &m, int &n)

本回答被网友采纳
第2个回答  2019-05-10
因为,add函数里面的i和main函数里面的i是不同。在add函数里面,当你执行完i++这个语句后,变量i就自动被销毁了,而且你的add函数的返回值为void,因此虽然加了1,但是最终结果并没有影响到外面。所以一直没有变。你可以尝试如下代码:
int main()
{
int i;
i = 1;
void add(int i);
i = add(i);
printf("%d", i);
}
int add(int i)
{
i++;
return i;
}追问

我不想让i=add(i),我只想通过一个函数直接改变i,而不是将i的值带入函数算出另一个值再赋给i。
我以前用函数的时候一开始也是循规蹈矩用return值,但是后来使用的时候发现多形参函数可以不返回值,就是说函数本身只是个在里面折叠一个函数的过程,但是我在做一个交换两个变量值的函数的时候发现什么都没发生,你的意思是不该把函数定义为void?

追答

这样的话,如果你是使用c++,可以使用引用来实现你说的这个功能。

void add(int &i) {i++;}

如果是c/c++,也可以使用指针来实现

void add(int *i) { (*i)++; }

调用的时候,就是add(&i);

另外,你说的“函数本身只是个在里面折叠一个函数的过程”,这句话也不对。实际上,在子函数里面,他会维护(存在)一个属于自己的空间,当它调用结束的时候,这些空间会被自动销毁,所以不会影响到外面的变量。

追问

这是我之前打过的一个例题,它的目的是已知三个顶点坐标,求三角形重心坐标,在其中有一个求中线的函数lines,输入三个顶点坐标,return‘做从第一个顶点到 二、三顶点连线中点 的线’的截距b,同时在这个lines函数中,还存在着这条中线的斜率a。然后在程序使用这个lines函数后,a并没有自动销毁,而是继续存在并可赋值a1,这和你说的“会自动销毁”相悖

追答

这种情况存在有两个可能性:

    没有销毁可能是因为是全局变量,只有在子函数里面的局部变量才会被销毁

    传入是变量的地址(或者是数组的首地址),这样也可以直接改变变量的值而不会被销毁。

在你的截图里面,这个变量a是全局变量,所以不会被销毁。一般来说,同一个文件里面的所有函数都可以访问以及修改全局变量的值。

第3个回答  2019-05-10

你再函数里i++的是形参的i,不是你传进去的i,所以外面的i是没变化的,把函数参数改成指针,然后把i地址传入就行了,代码如下:

#include <stdio.h>
int main()
{
int i;
i = 1;
void add(int *i);
add(&i);
printf("%d", i);
}
void add(int *i)
{
(*i)++;
}

相似回答