精华内容
下载资源
问答
  • 详解C语言函数返回值解析 程序一: int main() { int *p; int i; int*fun(void); p=fun(); for(i=0;i<3;i++) { printf(%d\n,*p); p++; } return 0; }; int* fun(void) { static int str[]={1,2,3,4...
  • C语言函数返回值详解

    万次阅读 多人点赞 2020-02-24 11:32:28
    函数返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。 return 语句的一般形式为: return 表达式;...C语言返回值 1 . 没有返回值函数为空类型,用...

    函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。

    return 语句的一般形式为:

    return 表达式;
    

    或者:

    return (表达式);
    

    有没有( )都是正确的,为了简明,一般也不写( )。例如:

    return max;
    return a+b;
    return (100+200);
    

    C语言返回值

    1 . 没有返回值的函数为空类型,用void表示。例如:

    void func(){
        printf("http://www.baidu.com\n");
    }
    

    一旦函数的返回值类型被定义为 void,就不能再接收它的值了。例如,下面的语句是错误的:

    int a = func();
    

    为了使程序有良好的可读性并减少出错, 凡不要求返回值的函数都应定义为 void 类型。

    2 . return 语句可以有多个,可以出现在函数体的任意位置,但是每次调用函数只能有一个 return 语句被执行,所以只有一个返回值。

    示例

    //返回两个整数中较大的一个
    int max(int a, int b){
        if(a > b){
            return a;
        }else{
            return b;
        }
    }
    

    如果a>b成立,就执行return a,return b不会执行;如果不成立,就执行return b,return a不会执行。

    3 . 函数一旦遇到 return 语句就立即返回,后面的所有语句都不会被执行到了。return 语句还有强制结束函数执行的作用。

    示例

    //返回两个整数中较大的一个
    int max(int a, int b){
        return (a>b) ? a : b;
        printf("Function is performed\n");
    }
    

    第 4 行代码则永远不会被执行。

    我们定义了一个判断素数的函数,这个例子更加实用:

    #include <stdio.h>
    
    int prime(int n){
        int is_prime = 1, i;
    
        //n一旦小于0就不符合条件,就没必要执行后面的代码了,所以提前结束函数
        if(n < 0){ return -1; }
    
        for(i=2; i<n; i++){
            if(n % i == 0){
                is_prime = 0;
                break;
            }
        }
    
        return is_prime;
    }
    
    int main(){
        int num, is_prime;
        scanf("%d", &num);
    
        is_prime = prime(num);
        if(is_prime < 0){
            printf("%d is a illegal number.\n", num);
        }else if(is_prime > 0){
            printf("%d is a prime number.\n", num);
        }else{
            printf("%d is not a prime number.\n", num);
        }
    
        return 0;
    }
    

    prime() 是一个用来求素数的函数。素数是自然数,它的值大于等于零,一旦传递给 prime() 的值小于零就没有意义了,就无法判断是否是素数了,所以一旦检测到参数 n 的值小于 0,就使用 return 语句提前结束函数。

    return 语句是提前结束函数的唯一办法。return 后面可以跟一份数据,表示将这份数据返回到函数外面;return 后面也可以不跟任何数据,表示什么也不返回,仅仅用来结束函数。

    我们让 return 后面不跟任何数据:

    #include <stdio.h>
    
    void prime(int n){
        int is_prime = 1, i;
    
        if(n < 0){
            printf("%d is a illegal number.\n", n);
            return;  //return后面不带任何数据
        }
    
        for(i=2; i<n; i++){
            if(n % i == 0){
                is_prime = 0;
                break;
            }
        }
    
        if(is_prime > 0){
            printf("%d is a prime number.\n", n);
        }else{
            printf("%d is not a prime number.\n", n);
        }
    }
    
    int main(){
        int num;
        scanf("%d", &num);
        prime(num);
    
        return 0;
    }
    

    prime() 的返回值是 void,return 后面不能带任何数据,直接写分号即可。

    扫一扫获取更多资讯哟!!!
    在这里插入图片描述

    展开全文
  • C语言允许函数返回值是一个指针(地址),我们将这样的函数称为指针函数。下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include #include char *strlong(char *str1, char *str2){...
  • 在运行成程序上有时会发现函数内部的值与返回到主函数的值会相差很多,但是它们的地址却相同!**一般的原因多是内存污染,多发于函数返回数组地址**或返回主函数后直接应用。 例如下面的两个程序,不用关心它做了...
    在运行成程序上有时会发现函数内部的值与返回到主函数的值会相差很多出现随机值,但是它们的地址却相同!**一般的原因多是内存污染,多发于函数返回数组地址**或返回主函数后直接应用。
    

    例如下面的两个程序,不用关心它做了什么,只需观察它们的不同点(已注释)

    #include <stdio.h>
    #include <ctype.h>
    int *count_e(char *str);
    int main(){
    	char str[] = {"abc,cba,def"};
    	int *a,i;
    	a = count_e(str);
    	puts("\n");
    	for(i=0;i<5;i++){
    		printf(" a[%d] = %d ; &a = %p;\n",i,a[i],&a[i]);
    	}
    	free(a);
    	return 0; 
    } 
    
    int *count_e(char *str){
    	if(str == NULL)
    		return NULL;
    	int ls[5] = {0};       //关键!!!内存污染问题! 
    	int i,k,t;
    	i = k = t = 0;
    	while(isspace(str[i]))
    		i++;                
    	while(str[i]){
    		if(isupper(str[i])){
    			ls[1]++;k=1;
    		}else if(islower(str[i])){
    			ls[2]++;k=1;
    		}else if(isdigit(str[i])){
    			ls[4]++;k=1;
    		}else if(isspace(str[i])){
    			t = 1;
    		}else{
    			ls[3]++;t=1;
    		} 
    		if(k==1 && t ==1){
    			ls[0]++;
    			k = t = 0;
    		}
    		i++;
    	} 
    	for(t=0;t<5;t++)
    		printf("ls[%d] = %d ; &ls[i] = %p\n",t,ls[t],&ls[t]);
    	if(! isspace(str[--i]))
    		ls[0]++;
    	return ls;
    }
    

    运行如下:
    ls[0] = 2 ; &ls[i] = 000000000062FDB0
    ls[1] = 0 ; &ls[i] = 000000000062FDB4
    ls[2] = 9 ; &ls[i] = 000000000062FDB8
    ls[3] = 2 ; &ls[i] = 000000000062FDBC
    ls[4] = 0 ; &ls[i] = 000000000062FDC0 // !!!

    a[0] = 239139376 ; &a = 000000000062FDB0;
    a[1] = 32760 ; &a = 000000000062FDB4;
    a[2] = 1 ; &a = 000000000062FDB8;
    a[3] = 0 ; &a = 000000000062FDBC;
    a[4] = 11146080 ; &a = 000000000062FDC0; // !!!注意

    ------------------------------------分割线-----------------------------------------

    #include <stdio.h>
    #include <ctype.h>
    int *count_e(char *str);
    int main(){
    	char str[] = {"abc,cba,def"};
    	int *a,i;
    	a = count_e(str);
    	for(i=0;i<5;i++){
    		printf(" a[%d] = %d ; &a = %p;\n",i,a[i],&a[i]);
    	}
    	free(a);
    	return 0; 
    } 
    
    int *count_e(char *str){
    	if(str == NULL)
    		return NULL;
    	int *ls = (int *)calloc(5,sizeof(int)); //ls[5] = {0}; !!!注意不同!!!内存污染问题!** 
    	int i,k,t;
    	i = k = t = 0;
    	while(isspace(str[i]))
    		i++;                
    	while(str[i]){
    		if(isupper(str[i])){
    			ls[1]++;k=1;
    		}else if(islower(str[i])){
    			ls[2]++;k=1;
    		}else if(isdigit(str[i])){
    			ls[4]++;k=1;
    		}else if(isspace(str[i])){
    			t = 1;
    		}else{
    			ls[3]++;t=1;
    		} 
    		if(k==1 && t ==1){
    			ls[0]++;
    			k = t = 0;
    		}
    		i++;
    	} 
    	for(t=0;t<5;t++)
    		printf("ls[%d] = %d ; &ls[i] = %p\n",t,ls[t],&ls[t]);
    	if(! isspace(str[--i]))
    		ls[0]++;
    	return ls;
    }
    

    运行如下:
    ls[0] = 2 ; &ls[i] = 00000000001D1430
    ls[1] = 0 ; &ls[i] = 00000000001D1434
    ls[2] = 9 ; &ls[i] = 00000000001D1438
    ls[3] = 2 ; &ls[i] = 00000000001D143C
    ls[4] = 0 ; &ls[i] = 00000000001D1440 //!!!!

    a[0] = 3 ; &a = 00000000001D1430;
    a[1] = 0 ; &a = 00000000001D1434;
    a[2] = 9 ; &a = 00000000001D1438;
    a[3] = 2 ; &a = 00000000001D143C;
    a[4] = 0 ; &a = 00000000001D1440; // !!!!

    此示例运用了分配内存的方法cmalloc()函数来替代直接创建的数组
    这是我在学习是遇到的小陷阱,根据电脑系统与编译器的不同可能不会出错,具体污染原因还是没有整明白。还是要注意留心。
    如有错误或好的解释还望指点。

    展开全文
  • c语言函数返回值问题

    千次阅读 2017-04-23 22:00:06
    C语言中,调用函数结束时,如果有返回值,会涉及到函数返回值传递问题,根据返回值的大小,会有不同的处理方式。 一、返回值小于等于4个字节 函数执行完毕后,如果返回值小于等于4字节,则会将值保存在寄存器eax中...

    C语言中,调用函数结束时,如果有返回值,会涉及到函数返回值传递问题,根据返回值的大小,会有不同的处理方式。
    一、返回值小于等于4个字节
    函数执行完毕后,如果返回值小于等于4字节,则会将值保存在寄存器eax中,然后在调用函数中通过读取eax的值来获得返回值。
    二、当返回值大小在[5, 8]字节范围内时
    因为eax寄存器只有四个字节,因此,当返回值在[5, 8]字节范围内时,一般采用eax和edx联合返回的方式进行的。其中eax存储返回值的低4字节,edx存储返回值的高4字节。
    三、当返回值大于8个字节时
    当返回值大于8个字节时,如返回较大的结构体,编译器会做如下处理:

    • 主调函数在其栈中的局部变量区域中额外开辟一片空间,将其一部分作为传递返回值的临时对象temp。
    • 将temp对象的地址作为隐藏参数传递给被调函数函数。
    • 被调函数函数将数据拷贝给temp对象,并将temp对象的地址用eax传出。
    • 被调函数返回后,主调函数将eax指向的temp对象的内容拷贝给n。
      这里写图片描述

    总结:

    • C语言对于小于8字节的返回值,以寄存器为中转。大于8字节的,以主调函数中新开辟的同样大小的中间变量temp为中转。故不到万不得已,不要轻易返回大尺寸对象。
    • C++函数的返回值传递大返回值略有不同,其可能是像C那样,1次拷贝到栈上的临时对象里,然后把临时对象拷贝到存储返回值的对象里。但,有些编译器会进行返回值优化RVO(Return Value Optimization),这样,对象拷贝会减少一次,即没有临时对象temp了,直接拷贝到主调函数的相应对象中。
    • C++对于返回值还有一种更“激进”的优化策略——NRV(Named Return Value)具名返回值优化
      这种优化是甚至连被调函数中的局部变量都不要了!直接在主调函数中操作对象(根据隐藏参数传入的对象的引用)。
    展开全文
  • C语言函数返回值与参数传递

    千次阅读 2019-10-26 11:57:43
    C语言函数返回值与参数传递 一:参数传递 C语言的函数中必不可少的就是参数传递,可以采用传值和传指针两种方式。 1.传值的形式:只是将参数值的拷贝传给函数,并非参数本体如: int test(int x,int y) { x=2*y; ...

    C语言函数返回值与参数传递

    一:参数传递

    C语言的函数中必不可少的就是参数传递,可以采用传值和传指针两种方式。
    1.传值的形式:只是将参数值的拷贝传给函数,并非参数本体如:

    int test(int x,int y)
    {
        x=2*y;
        return x;
    }
    int main(void)
    { 
        int a=0,b=5;
        printf("%d,%d\n\r",test(a,b),a);
    	return 0;
    }
    

    运行结果为:
    10,0
    即传值方式只可以将实参传递给函数,不可以改变实参本身。

    2.传指针形式:直接传给函数的是变量的地址。
    如:

    int a(int b,int *c)
    {
        int i=0;
        for(i=0;i<4;i++)
            c[i]=b*i;
        return 0;
        
    }
    int main(void)
    { 
        int b=2,c[4],i;
        a(b,c);
        for(i=0;i<4;i++)
    	    printf("Data is -> %d\n\r",c[i]);
    	return 0;
    }
    

    运行结果为:
    Data is -> 0
    Data is -> 2
    Data is -> 4
    Data is -> 6

    由于被调函数在参数指针的作用域之内,此时可以直接改变变量的本体。

    二:返回值

    函数除了参数传递还有返回值,既可以返回变量值也可以返回地址。
    1.返回变量
    如:

    int a(int b)
    {
        int i=5;
        return 5*b;
    }
    int main(void)
    { 
        int b=2;
    	printf("Data is -> %d\n\r",a(b));
    	return 0;
    }
    

    运行结果

    Data is -> 10

    2.返回地址

    int *test(int b)
    {
        int i=0,buf[4];
        for(i=0;i<4;i++)
            buf[i]=b*i;
        return buf;
        
    }
    int main(void)
    { 
        int  b=2;
        int *p;
        int  i=0;
        p=test(b);
        for(i=0;i<4;i++)
        	printf("%d ,%d \n\r",p[i],test(b));
    	return 0;
    }
    

    运行结果
    0 ,1084896256
    2 ,1084896256
    4 ,1084896256
    6 ,1084896256

    另外不能返回局部变量地址。

    int *buf()
    {
    	 int dad;
    	 double buf[3][2];
    	 dad=sizeof(buf);
      	 return &dad;//error:由于dad是局部变量,函数结束后释放。
    }
    
    展开全文
  • C语言函数返回值解析

    万次阅读 多人点赞 2018-04-09 12:35:53
    一般来说,函数在返回返回值的时候汇编代码一般都会将待返回的值放入eax寄存器暂存,接着再调用mov指令将eax中返回值写入对应的变量中,如下代码:做简单的sum运算, 1 #include&lt;stdio.h&gt; 2 #...
  • C语言函数返回值和变量类型

    千次阅读 2019-01-23 15:53:00
    借此机会,重新梳理下C语言函数返回值与变量类型的关系。 按照变量的寿命,可以分为三种类型  1.静态变量 寿命从程序开始运行,到程序关闭结束 储存在静态储存区中  2.自动变量 寿命从声明该变量的语句块到...
  • C语言函数返回值问题

    千次阅读 2017-11-12 09:25:02
    C语言函数返回值问题。
  • C语言函数返回值的实现方法和误区

    千次阅读 2018-10-19 15:12:11
    实例:你们认为这三个函数能正常返回吗?  int func1(int a , int b) { int c = 0; c = a + b; return c; } char * func2() { char *strTmp = "abs"; return strTmp; } char *func3() { char ...
  • 函数返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。...对C语言返回值的说明: 1) 没有返回值函数为空类型,用void表示。例如: void func(){ printf("http://.
  • C语言函数返回值

    2020-03-21 19:16:18
    注意事项 1.永远不要从函数中返回局部变量的地址,否则获取的地址的内容可能是乱码 更多内容 1.C语言函数返回值的相关问题
  • 看旋转编码器程序的时候,遇见了一些关于函数返回值的函数,感觉很懵逼,就百度了一下C语言函数调用,感觉写的挺好的, 原链接:http://c.biancheng.net/view/204.html   通常我们希望通过函数调用使主调函数能...
  • 如果函数里面定义了一个变量作为返回值,这里需要空间吧。 调用函数接受返回值又需要一份空间吧。 那是不是应该在函数里面分配内存,然后返回指针呢?这样看起来一份空间就搞定了。 就是不知道分配空间和销毁空间的...
  • C语言函数返回值不能直接写数组

    千次阅读 2014-02-12 14:48:40
    C语言返回值不能直接写数组 #ifndef _VMATH_H #define _VMATH_H #ifdef _cplusplus extern "C" { #endif typedef float Matrix44f[16]; Matrix44f translate(float x, float y, float z); Matrix44f scale...
  • 浅谈C语言函数返回值--局部变量和局部变量地址

    千次阅读 多人点赞 2014-05-15 10:40:18
    C语言中,局部变量的作用域只在函数内部,在函数返回后,局部变量的内存就会被释放。如果函数只是返回局部变量,那么这个局部变量会被复制一份传回被调用处。但是如果函数返回的是局部变量的地址,那么就会报错,...
  • (转)C语言函数返回值什么意思

    千次阅读 2012-03-15 17:05:05
    所谓函数返回值是一个函数在运算结束以后向调用它的母函数或者系统反馈一个值,这个值可以是各种变量类型.举个简单的例子:int add(int a,int b){ return (a+b);}int main(){ int res; res=add(3,
  • 有时遇到函数返回值为空和函数返回值为指针的情况下,需要在前面定义该函数//函数的返回值为指针也必须在此定义, //函数的返回值为void必须在此定义,返回值是整形或者其他基本类型不需要在此定义 #include #...
  • //假设函数返回值为int型 那么相对应的调用两次呢,就像我的代码里的那样调用两次(加了个n);这个时候输出m,n,若m等于赋值过来的返回值6,而根据static静态变量的参数保留特性( 具体解释是再次调用该函数时此...
  • 返回局部变量地址
  • C语言函数返回值的获取

    千次阅读 2010-06-27 23:00:00
    以下帮你列出几种获得函数返回值的方法 1)使用return获得 例如 function() { return 10; } main() { int a; a = function(); } 2)使用全局...
  • C语言指针作为函数返回值

    千次阅读 2020-02-26 14:43:57
    C语言允许函数返回值是一个指针(地址),我们将这样的函数称为指针函数。 我们定义一个函数 strlong(),用来返回两个字符串中较长的一个: #include <stdio.h> #include <string.h> char *strlong...
  • 关于C语言函数的默认返回值

    千次阅读 2019-09-05 21:37:38
    C语言函数默认返回值 int型函数运行无误默认返回值为1,而float默认返回值为函数中最后一个操作过的float变量的值. #include <stdio.h> int foo1() { int i, j, k; i = 3; j = 2; k = 5; } float foo2() ...
  • C语言中一般用typedef来为回调函数定义别名(参数名)。 别名通过宏定义typedef来实现,不是简单的宏替换。可以用作同时声明指针型的多个对象。 比如: 代码如下:char *pa,pb;//pa是一个char型指针,但pb是一个...
  • 最近码代码时遇到一个返回值的问题,一直报warning,后来查了下资料才知道原因,现在做下记录。 typedef struct { int a; int b; }Test_T; Test_T c[3]; Test_T* fun(void) { return &c; } 一开始是这样写的...
  • C语言main函数返回值详解

    万次阅读 2019-08-30 23:54:28
    前言:本文程序代码均在...C语言的main函数有两个标准写法 // C99加入两种 main 标准写法 int main(void) // 标准一写法 // 和 int main(int argc,char *argv[]) // 标准二写法 int main(int argc,char **argv) // ...
  • C语言函数返回值 参数

    千次阅读 2021-03-24 10:29:54
    1.void代表无返回值,不需要return 2.void代表返回值的类型是无类型,return要写但后面不加变量 形式参数,意思有点类似变量定义,写法类似变量的定义 如果调用的函数带有参数,必须传参 何时申请了该空间: 当函数...
  • C语言函数返回值实现机制

    千次阅读 2016-06-29 20:18:34
    但是返回值会被保存在cpu的寄存器中,因此,在返回子函数后,返回值能从寄存器中将返回值赋值给调用函数中的变量,如果返回值是一个指针,那么该指针所指的内存地址会被保存在寄存器中,但是,指针指向

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 165,431
精华内容 66,172
关键字:

c语言函数返回值

c语言 订阅