一个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)++;
}

【C语言】一个比较基础的问题啦 要求输入一串字符,只能是数字或字母或...
if(c>='0' && c<='9')return 1;else return 0;} int isLetter(char c)\/\/判断是否是字母,是返回1,不是返回0 { if((c>='a' && c<='z') || (c>='A' && c<='Z'))return 1;else return 0;}

c语言一个最最基础的问题——include的用法。
1、C语言预处理器指令#include用于在编译期间把制定文件的内容包含进当前文件中,又称文件包含指令。在源文件中,任何形如 include "文件名"或 include <文件名> 的行都被替换为由文件名指定的文件的内容。如果文件名用引号引起来,则在源文件所在位置查找该文件;如果在该位置没有找到文件,或者如果文...

请教一个C语言很基础的问题,我想求出所输a+b+c的值,为什么不行?
你的定义也有问题,应该在开始就定义还有你的printf格式为printf("text格式转换符",D);scanf("%d,%d,%d",&a,&b,&c);精简后为:include<stdio.h> void main(){ int a,b,c;int D;scanf("%d,%d,%d",&a,&b,&c);D=a+b+c;printf("%d",D);} 你试着运行一下看看 ...

C语言函数基础题求解求帮忙~
=1.0\/(1.0+1.0\/(1.0+f3(1)))=1.0\/(1.0+1.0\/(1.0+1))=1.0\/(1.0+1.0\/2)=1.0\/(1.5)=0.666666666 保留小数点1位 即0.7 \/***1***\/ 填上 long s=0; 就可以了

还是一个狠狠狠狠狠狠基础的C语言问题
int z;if(x>y)z=x;else z=y;return(z);\/*z保存最大的数字,不是x*\/ } \/\/如果函数写主函数前面就不用声明了,否则int max(int x,int y);\/*函数声明应该放这里*\/ int main(){ int a,b,c;scanf("%d,%d",&a,&b);\/*注意双引号的位置*\/ c=max(a,b);printf("max=%d\\n",...

c语言函数问题:1.不需要返回值的函数,即直接让函数输出某个值或符号...
void表示函数无返回值,也就不需要写return。如没有返回值的函数,void要写,否则默认返回值是int型需要return语句。关于函数返回多个值,有很多方法:一、不返回,函数返回值依然是void,但传值的时候传变量地址,那么在函数运行中改变变量地址里的值,函数运行结束,外面实参变量也改变了。比如void fun(...

一个C语言简单问题——int fun(int n)是什么意思
fun()函数内部的C+=fun(i-2)实际上表明这个函数采用了递归型算法。递归做为一种算法在程序设计语言中广泛应用,就是指一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述...

请教大家一个c语言中的问题?这个问题已经困扰我很久了。题目如下:_百 ...
首先你要明确这样一个问题。在C语言中,变量是有生命周期和作用域的(链接类型暂时不提)生命周期,指变量对程序可见的范围 作用域,指变量对程序可修改的范围 注意:有生命周期的变量不一定有作用域(也就是说,可以访问的变量不一定全是可修改的)另外你应该知道,C语言函数只能按值传参,而且形参被...

一道基础C语言题,求解,最好附上这部分的知识点(通俗易懂点)。_百度知...
每一个程序在执行时都占用一款可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区(free store)或堆(heap).C语言程序使用一对标准库函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new和delete表达式实现相同的功能.1.动态数组的定义数组变量通过指定类型、数组名和维数来定义.而动态...

一个c语言的小问题 while(scanf("%d",&n))超时,而改成while(scanf("%d...
1. 当输入为一个整数时,读取到n,scanf返回值是1(表示成功读取了一个数),ok,继续执行 2. 当输入为EOF(通常切的题目有多组数据,会使用EOF表示输入结束),这时,没有读取输入到n,scanf返回值是-1,所以您的代码==1就不成立,所以会跳出循环。而如果是while(scanf("%d", &n))的话,即...

相似回答