精华内容
下载资源
问答
  • C语言函数返回指针方法

    千次阅读 2019-05-23 09:18:00
    由于static修饰的变量,分配在静态内存区(类似于全局变量区),函数返回时,并不会释放内存,因此可以将要返回的变量加static修饰。 1 int *test_func() 2 { 3 static int local_data; //加static修饰 4 ...

    1、将函数内部定义的变量用static修饰

    由于static修饰的变量,分配在静态内存区(类似于全局变量区),函数返回时,并不会释放内存,因此可以将要返回的变量加static修饰。

     1 int *test_func()
     2 {
     3     static int local_data;  //加static修饰
     4     local_data = 10;
     5 
     6     printf("Function local_data : %d\n", local_data);
     7 
     8     return &local_data;
     9 }
    10 
    11 int main()
    12 {
    13     int *main_data = NULL;
    14 
    15     main_data = test_func();
    16 
    17     printf("Return data: %d\n", *main_data);
    18 
    19     return 0;
    20 }

     

    2、使用分配在堆上的内存

    分配在堆上的内存主要指通过malloc、calloc、realloc等函数动态分配的内存,由于堆上的内存需要手动释放,因此可以在使用完以后再释放,这样指针就不会指向未知。

    注意:堆上的内存必须要用完即释放,否则容易造成内存泄漏。

     1 int *local_data_test()
     2 {
     3     int *plocal_data;
     4 
     5     plocal_data = (int *)malloc(sizeof(int));
     6     *plocal_data = 20;
     7 
     8     printf("Function plocal_data value: %d\n", *plocal_data);
     9 
    10     return plocal_data;
    11 }
    12 
    13 int main()
    14 {
    15     int *main_data = NULL;
    16     
    17     main_data = local_data_test();
    18 
    19     printf("Return data: %d\n", *main_data);
    20     free(main_data);
    21     main_data = NULL;
    22 
    23     return 0;
    24 }

    另外一般要返回指针的情况,也可以用全局变量或者传入指针参数代替。

    转载于:https://www.cnblogs.com/xbook-ben/p/10909946.html

    展开全文
  • C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include #include char *strlong(char *str1, char *str2){...
  • 一、返回指针函数  指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的。 返回指针函数的一般形式为:类型名 * 函数名(参数列表)  比如下面这个函数,返回一个指向char类型变量的...

    一、返回指针的函数

     指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的。

    返回指针的函数的一般形式为:类型名 * 函数名(参数列表)

     比如下面这个函数,返回一个指向char类型变量的指针

    复制代码
     1 // 将字符串str中的小写字母变成大写字母,并返回改变后的字符串
     2 // 注意的是:这里的参数要传字符串变量,不能传字符串常量
     3 char * upper(char *str) {
     4     // 先保留最初的地址。因为等会str指向的位置会变来变去的。
     5     char *dest = str;
     6     
     7     // 如果还不是空字符
     8     while (*str != '\0') {
     9         // 如果是小写字母
    10         if (*str >= 'a' && *str <= 'z') {
    11             // 变为大写字母。小写和大写字母的ASCII值有个固定的差值
    12             *str -= 'a' - 'A';
    13         }
    14         
    15         // 遍历下一个字符
    16         str++;
    17     }
    18     
    19     // 返回字符串
    20     return dest;
    21 }
    复制代码

    里面的代码我就不详细解释了,重点看第2行的定义形式。

    调用这个函数也非常简单:

    复制代码
    int main()
    {
        // 定义一个字符串变量
        char str[] = "lmj";
        
        // 调用函数
        char *dest = upper(str);
        
        printf("%s", dest);
        return 0;
    }
    复制代码

    输出结果:

     

    二、指向函数的指针

    看到这个标题,你可能觉得很诧异,指针竟然可以指向一个函数,那我就先解释一下为什么指针可以指向一个函数

    1.为什么指针可以指向一个函数

    函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址

     

    2.指向函数的指针的定义

    定义的一般形式:函数的返回值类型 (*指针变量名)(形式参数1, 形式参数2, ...);

    注意:形式参数的变量名可以省略,甚至整个形式参数列表都可以省略

    复制代码
     1 #include <stdio.h>
     2 
     3 int sum(int a, int b) {
     4     return a + b;
     5 }
     6 
     7 int main()
     8 {
     9     // 定义一个指针变量p,指向sum函数
    10     int (*p)(int a, int b) = sum;
    11     // 或者 int (*p)(int, int) = sum;
    12     // 或者 int (*p)() = sum;
    13     
    14     // 利用指针变量p调用函数
    15     int result = (*p)(1, 3);
    16     // 或者 int result = p(1, 3);
    17     
    18     printf("%d", result);
    19     return 0;
    20 }
    复制代码

    *先在第3行定义了一个sum函数,接收2个int类型的参数,返回值类型为int

    * 然后在第10行定义了一个指向sum函数的指针变量p。注意p的定义形式:int (*p)(int a,int b),第1个int代表sum函数的返回值是int类型,然后*p是用括号()包住的,后面的int a和int b代表着sum函数的形参,其实完全可以省略。第10行、11行、12行都是可行

    * 在第15行,先利用*p取出指向的函数,再传入参数调用函数。也可以采用第16行中的做法,这样就跟调用普通函数没什么区别

    最后的输出结果:,毫无意外

     

    3.使用注意

    1> 由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的。难道p++就会指向下一个函数了?可笑至极!!没这回事。

    2> 返回指针的函数的定char *upper(char *str) 和 指向函数的指针的定义int (*p)(int a, int b)非常相似,使用时特别注意区分

    3> 指向函数的指针变量主要有两个用途:

    • 调用函数

    • 将函数作为参数在函数间传递。我这么一说,可能还不是很明白,举个例子。

    复制代码
     1 #include <stdio.h>
     2 
     3 // 减法运算
     4 int minus(int a, int b) {
     5     return a - b;
     6 }
     7 
     8 // 加法运算
     9 int sum(int a, int b) {
    10     return a + b;
    11 }
    12 
    13 // 这个counting函数是用来做a和b之间的计算,至于做加法还是减法运算,由函数的第1个参数决定
    14 void counting( int (*p)(int, int) , int a, int b) {
    15     int result = p(a, b);
    16     printf("计算结果为:%d\n", result);
    17 }
    18 
    19 int main()
    20 {
    21     // 进行加法运算
    22     counting(sum, 6, 4);
    23     
    24     // 进行减法运算
    25     counting(minus, 6, 4);
    26     
    27     return 0;
    28 }
    复制代码

    如果以后想再增加一种乘法运算,非常简单,根本不用修改counting函数的代码,只需要再增加一个乘法运算的函数

    int mul(int a, int b) {
        return a * b;
    }

    后counting(mul, 6, 4);就可以进行乘法运算了


    转载出处:http://blog.csdn.net/u012252959/article/details/53606374

    展开全文
  • C语言 函数返回数组和指针区别

    千次阅读 2017-09-14 10:42:32
    ”存放在常量区,它在程序运行结束由操作系统回收,而指针p存放的是它的地址,在函数返回时候把它的地址返回给主函数,所以可以正确打印字符串。 函数str8(),在主函数未调用,因为调用程序会出现栈溢出,程序会停止...

    1.示例代码

    #include <stdio.h>
    
    char * str1()
    {
    	char A[] = "Hello!";
    	return A;
    }
    char * str2()
    {
    	char A[] = "Hello!";
    	char *p;
    	p = A;
    	return p;
    }
    char * str3()
    {	
    	char A[1024] = "Hello!";
    	return A;
    }
    char * str4()
    {
    	char A[1024] = "Hello!";
    	char *p;	
    	p = A;
    	return p;
    }
    char * str5()
    {
    	char A[1024] = "Hello!";
    	char *p;
    	A[1018] = 'h';
    	A[1019] = 'e';
    	A[1020] = 'l';
    	A[1021] = 'l';
    	A[1022] = 'o';
    	A[1023] = '\0';
    	p = A;
    	p += 1018;
    	return p;
    }
    char * str6()
    {
    	static char A[1024] = "Hello!";
    	char *p;
    	A[1018] = 'h';
    	A[1019] = 'e';
    	A[1020] = 'l';
    	A[1021] = 'l';
    	A[1022] = 'o';
    	A[1023] = '\0';
    	p = A;
    	p += 1018;
    	return p;
    }
    char * str7()
    {
    	char *p = "Hello!";
    	return p;
    }
    char * str8()
    {
    	char A[1024*1009] = "Hello!";
    	return A;
    }
    
    
    void main()
    {
    	printf("str1:%s\n", str1());
    	printf("str2:%s\n", str2());
    	printf("str3:%s\n", str3());
    	printf("str4:%s\n", str4());
    	printf("str5:%s\n", str5());
    	printf("str6:%s\n", str6());
    	printf("str7:%s\n", str7());
    	//printf("str8:%s\n", str8());
    }

    2.运行结果



    3.结果分析

    • 函数str1()和str2()返回乱码,这是因为函数运行时函数参数和函数里面的局部变量是存放在栈(stack)中,当函数结束返回时栈也被系统回收,所以返回的数组或者指针所指向的地址数据已经被覆盖,为乱码;
                注:更多了解程序在内存的位置参考:http://blog.csdn.net/hairetz/article/details/4141043#reply
    • 函数str3()和str4()为什么可以正常返回呢,组数在栈中的数据在函数返回时没有被操作系统回收吗?这个问题的答案留在下面回答。
    • 函数str5()中从数组的A[1018]元素到A[1023]元素分开赋值,然后指针P指到数组的A[1018]元素返回,打印结果乱码;
    • 函数str6()与str5()不同之处在于在声明数组A[]的时候加上static关键字,这表明数组中的数据不再存放在内存中的栈而是存放在静态变量区和全局变量放在一个区域,只有在程序运行结束后系统才会回收,所以可以正常返回;
    那么为啥函数str3()和str4()可以正常返回数组结果,str5()不可以呢,这是因为,他们三个函数中的数组都存放在内存中的栈中,只是因为数组设置的比较 大为1024,当存放的是小数组“Hello!”时候可以返回是因为内存没有被完全覆盖,而在函数str5()中在数组的后面几个元素被覆盖了,所以输出乱码;这是偶然现象,如果在栈被回收后立马被完全利用,那么函数str3()和函数str4()返回的结果也会是乱码。
    • 为什么函数str7()可以正常返回字符串呢?这是因为声明的字符指针p存放在栈中,而“Hello!”存放在常量区,它在程序运行结束由操作系统回收,而指针p存放的是它的地址,在函数返回时候把它的地址返回给主函数,所以可以正确打印字符串。
    • 函数str8(),在主函数未调用,因为调用程序会出现栈溢出,程序会停止运行,可以看出这里的栈大小大约为1M Byte。

    4.如何修改

      那么如何修改成程序使得函数可以返回数组,这里有以下几种方法:
    1.   如上面程序str6()中把数组声明为static 存放在静态变量区,但是这样存在内存泄漏,也可以通过malloc(C语言)或者new(C++)将数组声明在堆(heap)中,
                然后在函数使用完后free()或者delete内存;不过有可能存在在函数外面忘记释放内存的情况;
             2.通过指向数组的指针或者结构实现,参考:http://blog.csdn.net/zouxinfox/article/details/2525206
             3.建议使用把数组作为函数的形参传递进去,在调用函数的主函数声明数组,在使用完后释放数组,参考:http://www.cnblogs.com/yangxi/archive/2011/09/18/2180759.html

    5. 思考

     在理解程序在内存中的存储情况,可以方便理解这个问题。
    展开全文
  • c语言函数的数组返回指针返回

    千次阅读 2019-04-13 10:09:52
    函数内的数组和指针都是属于函数栈空间。如果把数组或指针返回给外部指针,会发生什么? 1先看看第一种,返回数组; #include "stdio.h" char * get_c() { char ch[]="hello"; //这是一个栈空间 char *p; /...

        函数内的数组和指针都是属于函数栈空间。如果把数组或指针返回给外部指针,会发生什么?

    1先看看第一种,返回数组;

    #include "stdio.h"
    
    
    char * get_c()
    {
    	char ch[]="hello";  //这是一个栈空间
    	char *p;			//这也是栈空间
    	p=ch;
    	printf("%x\n",&ch);
    	printf("%x\n",p);
    	printf("%s\n",p);
    	return ch;
    }
    
    int main(int argc, char const *argv[])
    {
    	char *ch;
    
    	ch=get_c();
    
    	printf("%x\n",ch);
    	printf("%s\n",ch);
    	while(1);
    	return 0;
    }

    运行效果:会直接报警告,当然可以无视啦,不过数组的地址居然没有返回出来,地址是0,当然里面也不会有数据啦。

    2看看返回指针的情况:

    #include "stdio.h"
    
    
    char * get_c()
    {
    	char ch[]="hello";  //这是一个栈空间
    	char *p;			//这也是栈空间
    	p=ch;
    	printf("%x\n",&ch);
    	printf("%x\n",p);
    	printf("%s\n",p);
    	return p;
    }
    
    int main(int argc, char const *argv[])
    {
    	char *ch;
    
    	ch=get_c();
    
    	printf("%x\n",ch);
    	printf("%s\n",ch);
    	while(1);
    	return 0;
    }

    运行效果:编译没有错误,地址成功返回了,但是里面的数据居然是乱码,我们可以猜测,由于栈被回收了,这个内存就不属于

    这个数组了,系统或者任务会主动的修改里面的数据,导致就算这个指针指向这个内存,值可能已经不是自己想要的了,也就是

    一个野指针吧。

     

    展开全文
  • 指针函数:返回值为指针函数指针函数:返回值为指针函数 函数指针:只想函数指针 函数指针数组:存放函数指针的数组 2、是什么样子 指针函数: 数据类型 * 函数名 (参数); 例: 返回值为int型指针函数,...
  • 返回指针函数(指针函数) 什么是返回指针函数 一个函数可以返回一个整形值 字符型值 实型值 1、如果一个函数它的返回值是一个地址(是一个指针的话),这个函数是一个返回值是指针即指针函数。 2、返回指针的...
  • 详解C语言指针函数函数指针函数指针数组

    万次阅读 多人点赞 2018-07-09 11:08:24
    C语言中,指针是一个很重要但是又很容易弄错的概念,也可以说指针就是C语言的灵魂,所以说学好指针对于完全掌握C语言是...指针函数就是返回指针值的函数,本质是一个函数。所以指针函数等价于“返回值为指针的函数...
  • C语言 函数指针指针函数及Main()函数

    万次阅读 多人点赞 2018-09-04 10:59:01
    指针函数,简单的来说,就是一个返回指针函数,其本质是一个函数,而该函数的返回值是一个指针。 声明格式为:类型标识符 *函数名(参数表) 这似乎并不难理解,再进一步描述一下。 看看下面这个函数声明: int ...
  • * *Toreturntheintegerarrayfromthefunction,youshould: *-Storethesizeofthearraytobereturnedintheresult_countvariable *-Allocatethearraystaticallyordynamically * *Forexample, ...*int*return_integer_...
  • 那么,我们在C语言的结构体中,只能通过定义函数指针的方式,用函数指针指向相应函数,以此达到调用函数的目的。函数指针函数类型 (*指针变量名)(形参列表);第一个括号一定不能少。“函数类型”说明函数返回类型...
  • C语言中子函数的返回值是一个指针(地址)时,我们将这个子函数称为指针函数 ...//因为子函数返回的是一个指针,所以子函数名称需要定义为指针格式char *strlong char *strlong(char *str1, c...
  • C语言函数指针和回调函数的详解

    万次阅读 多人点赞 2019-05-18 23:10:01
    函数指针:指向函数指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个...
  • c语言函数指针_指针函数_返回值是函数指针

    千次阅读 多人点赞 2019-03-06 17:38:43
    顾名思义,指针函数返回指针函数。其一般定义形式如下: 类型名 *函数名(函数参数表列); 其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带...
  • c语言指针,return以及函数返回值

    万次阅读 多人点赞 2018-11-15 00:00:10
    指针作为c语言的精华所在所以会多学习几天来扎实的掌握 void* 这不叫空指针,这叫无确切类型指针.这个指针指向一块内存,却没有告诉程序该用何种方式来解释这片内存.所以这种类型的指针不能直接进行取内容的操作.必须...
  • c语言中将函数指针作为形参 在C中将指针作为函数参数 (Pointers as Function Argument in C) Pointer as a function parameter is used to hold addresses of arguments passed during function call. This is also...
  • 函数指针 10.1.1 函数类型 通过什么来区分两个不同的函数? 一个函数在编译时被分配一个入口地址,这个地址就称为函数指针函数名代表函数的入口地址。 函数三要素: 名称、参数、返回值。C语言中的函数有自己...
  • c语言中,一般函数都是占用一段连续的内存区,而函数名就是这段连续内存区的首地址,而且指针也代表着地址。所以,我们可以吧函数名(函数首)赋值给指针变量,用指针来调用这个函数。 格式:int (*p)() :表示...
  • 理解函数指针和定义 先看一下一段代码: #define _CRT_SECURE_NO_WARNINGS 1 #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; void test() { printf("hehe\n"); } int main...
  • //函数 使用结构体作为返回 可返回指针,数组或常数 #include <stdio.h> //声明结构体 包含一个数组和一个整型 typedef struct { float s_dataout[10]; int s_length; } s_out; //子函数 s_out add...
  • C语言返回字符串函数共有四种方式,分别如下: 使用堆空间,返回申请的堆地址,注意释放 函数参数传递指针返回指针 返回函数内定义的静态变量(共享) 返回全局变量 下面来看看详细的介绍 其实就是要返回一...
  • C语言函数指针的参数传递

    千次阅读 2014-10-16 22:49:30
    c语言函数传递指针的一些杂谈和陷阱。
  • 我们大家都知道指针函数返回指针不能指向函数内的自动变量,如果需要返回函数的内部变量的话,就需要将该变量声明为静态变量。为什么函数能够返回 静态变量的地址而不能返回局部自动变量的地址,到底什么样的对象...
  • 指针函数实现。 //例题10-24 有若干个学生的成绩(每个学生有4门课),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数实现。 #include<stdio.h> int main() { float score[][4]={{60,...
  • C语言函数指针与回调用函数

    万次阅读 2018-05-22 01:48:23
    1. 函数指针 指针c语言的精髓,同时也是c语言中比较深奥、比较难掌握的一个知识点。本质上,对于一个内存单元来说,单元的地址即为指针, 其中存放的数据才是该单元的内容。我们允许用一个变量来存放指针,这种...
  • C语言结构体与指针函数指针

    千次阅读 2019-01-29 21:55:31
    本篇博文主要介绍结构体、函数指针的应用 结构体(struct),主要分三个部分 建立结构声明:描述结构如何组合的主要方法,创建一个模板 例如:struct book { char title[MAX]; char author[MAX]; ...
  • C语言strerror()函数返回错误原因的描述字符串 头文件: #include 定义函数: char * strerror(int errnum); 函数说明:strerror()用来依参数errnum 的错误代码来查询其错误原因的描述字符串, 然后将该字符串...
  • C语言程序在编译后,每个函数都有一个首地址(也就是函数第一条指令的地址),这个地址称为函数指针。可以定义指向函数指针变量,使用指针变量间接调用函数。 先用一个简单的程序来说明: #include <stdio.h&...
  • C语言函数指针数组

    千次阅读 2016-12-29 23:22:30
    函数指针数组概念: ... 返回类型说明符 (*函数指针数组名[])(参数列表) = {函数指针/函数名,…}; 如下: int (*fun_array[])(int,int) = {add,del,mul,div};函数指针数组的使用如下: 函数指针数组名下标
  • 深入浅出剖析C语言函数指针与回调函数(一)

    万次阅读 多人点赞 2017-03-24 00:19:41
    关于静态库和动态库的使用和制作方法。...什么是回调函数?...如果你把函数指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 188,453
精华内容 75,381
关键字:

c语言函数返回指针

c语言 订阅