-
2020-10-18 17:01:55
List item
下文主函数调用receive函数得到receive函数内的a数组,并打印输出:
:-------------------------------------------------------------------------------------------------------
C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。
如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:
int *myFunction(void)
{
.
.
}
另外,C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。
所以我们将数组a定义为static类型
:--------------------------------------------------------------------------------------------------------
我们使用3种方式打印接收到的数组
方法1:
定义一个指针变量指向一个一维数组的首元素,利用该指针变量就可以访问数组中的任何一个元素
方法2:
定义一个指针变量指向一个一维数组的首元素,利用%s函数输出数组
方法3:
利用sprintf函数把数组输出到已经定义的另一个数组,再利用puts()输出
: ---------------------------------------------------------------------------------------------------------
代码:#include <stdio.h> #include <string.h> /* C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。 如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下: int *myFunction(void) { . . } 另外,C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 所以我们将数组a定义为static类型 **/ unsigned char *receive(){ static unsigned char a[10]={'1','2','3','4','5','6','7','8','9'}; return a; } /* 我们使用3种方式打印接收到的数组 方法1: 定义一个指针变量指向一个一维数组的首元素,利用该指针变量就可以访问数组中的任何一个元素 方法2: 定义一个指针变量指向一个一维数组的首元素,利用%s函数输出数组 方法3: 利用sprintf函数把数组输出到已经定义的另一个数组,再利用puts()输出 **/ int main(void) { unsigned char *p; unsigned char m[10]; p = receive(); //方法1: putchar(*p); //方法2: printf("\np = %s\n",p); //方法3 sprintf(m,"%s",p); puts(m); return 0; }
更多相关内容 -
C语言子函数的创建及使用
2020-03-04 17:06:57C语言自创函数C语言自创函数
#include <stdio.h> int p()/*平常我们都是直接定义主函数,现在主函数在下面去了, 这个P()就是我们的自创函数自创函数和主函数一样的书写。这个自创函数为无定义型*/ { printf("小红在CSDN上学习"); return 0; } int study(int num)/*这个也是自定义函数,这个是定义了参数的自创函数*/ { printf("小红在CSDN上已经参与学习了%d门课程",num); return 0; } int main() { p(); study(5);//此处的参数会传递给第二个有参数的自定义函数。 return 0; }
输出结果:
同理如果我们把主函数中的study参数设置为6结果就是下面这个啦!
为了方便理解可以再参考C语言中使用自定义函数计算三角形周长
----------------------------------分割线----------------------------------
本人承诺以上文章为本人编写,绝非复制粘贴。写在这里一是为了防止以后自己将知识点遗忘,二是为了和大家分享我自己对这个知识点的理解和认识。如果我的文章中有错误希望看到后可以指正,感激不尽! -
C语言 子函数改变指针指向的值
2021-08-29 15:39:05C子函数改变指针指向的值 首先,为了防止出错,我还在在《C primer plus》中再看了一次概念。 如下: 指针是个左值,就跟我们定义一个 int a = 10;一样。 接着再查找间接运算符*的说明。 如下: 首先我们写个对的...C语言 子函数改变指针指向的值
首先,为了防止出错,我还在在《C primer plus》中再看了一次概念。
如下:
指针是个左值,就跟我们定义一个 int a = 10;一样。
接着再查找间接运算符*的说明。
如下:
首先我们写个对的。#include <stdio.h> int b = 30; void trans(int** n) { //int b = 30;//不能在里面进行定义堆栈会回收释放 *n = (int*)&b; printf("b add =%p\n", &b); printf("*n add =%p\n", *n); printf("**n =%d\n", **n); } int main() { int a=10; int* p = (int*)&a;//指针创造的也只是个左值,指向地址。 printf("p add =%p\n", p); trans(&p); printf("a add =%p\n",&a); printf("p add =%p\n",p); printf("*p =%d\n",*p); return 0; }
这里可以通过子函数改变指针指向的地址。
结果图:
换个失败的子函数,也是容易犯的错误void trans(int* n) { n = (int *)&b; //*n = 33; printf("b add =%p\n", &b); printf("*n add =%p\n", n); printf("*n =%d\n",*n); }
结果图:
可以看到指向并没有改变。这里我想讲讲我的理解:
子函数涉及堆栈区操作,在子函数要有一个压栈创建临时变量的工作,如果只是一个临时变量的话,则用完之后就会释放,而如果是地址传递则是直接对全局变量区进行操作,所以值能改变,自然就变成了指向的改变。
当然肯定有小伙伴说我为什么要用子函数来进行指针指向的改变,这样只会增加我的大脑负担啊。
没错,的确是这样的!!!
这种容易引起误会的操作在大量的代码工作中只会让我们疲于应对。
本人只是闲暇之余的探讨。如果一定要用到子函数来改变指针的指向的话最好子函数返回赋值给指针。
如:
int *p = get_new_arg(参数,参数);
-
c语言子函数返回字符串的正确方式
2019-04-09 22:34:46c语言子函数返回字符串的错误 最近做leetcode上的一道题,通过子函数返回字符串。开始时用局部变量的字符串返回的,认为返回了字符串的首地址,便可以get到这个字符串,但由于局部变量离开函数后被回收了,因此字符...c语言子函数返回字符串的错误
最近做leetcode上的一道题,通过子函数返回字符串。开始时用局部变量的字符串返回的,认为返回了字符串的首地址,便可以get到这个字符串,但由于局部变量离开函数后被回收了,因此字符串首地址是收到了,但是所在内容却被回收,因此出错。
//这是出错代码 #include<stdio.h> #include<stdlib.h> #include<string.h> char* intToRoman(int num) { int base[13] = { 1000,900,500,400,100,90,50,40,10,9,5,4,1 }; char * basestr[13] = { "M","CM","D","DM","C","XC","L","XL","X","IX","V","IV","I" }; int count[13]; for (int i = 0; i < 13; i++) { count[i] = num / base[i]; num -= base[i] * count[i]; } char s[100];//这样子是局部变量 int index = 0; for (int i = 0; i < 13; i++) { for (int j = 0; j < count[i]; j++) { strcpy(s + index, basestr[i]); index += strlen(basestr[i]); } } s[index] = '\0'; return s; } int main() { printf("%s",intToRoman(3)); }
正确做法
法一:通过malloc函数分配
因为malloc函数分配内存在堆区,运行过程中由程序员自己管理,系统不回收。char* intToRoman(int num) { int base[13] = { 1000,900,500,400,100,90,50,40,10,9,5,4,1 }; char * basestr[13] = { "M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I" }; int count[13]; for (int i = 0; i < 13; i++) { count[i] = num / base[i]; num -= base[i] * count[i]; } char *s=(char*)malloc(sizeof(char)*100); int index = 0; for (int i = 0; i < 13; i++) { for (int j = 0; j < count[i]; j++) { strcpy(s + index, basestr[i]); index += strlen(basestr[i]); } } s[index] = '\0'; return s; }
法二:
通过引用传递(或者说传指针)
法三:
全局变量(不推荐) -
C语言子函数的使用,子函数放前面和放后面的区别
2020-11-17 11:53:19/* 申明子函数:这里注意只有再main函数下面的才需要子函数申明 函数申明一般是写在这里当然写在main函数中也是可以的 */ int max(int _X, int _y); //求最大数值 int min(int _X, int _y) //求最小数值:程序实现... -
C语言子函数返回二维数组讨论
2020-08-22 20:41:08C语言中,在子函数中将一个二维数组返回 都知道,在子函数中,一定不能返回一个局部变量的指针,局部变量在子函数中进行创建,子函数调用结束后,该指针将被释放掉。 如果被指针所指向的该内存空间被别的程序占用着... -
如何写出一个返回多个值的c语言子函数
2016-07-22 10:23:35我的思路是利用三个数比大小的子函数,然后返回min,max,然后接着调用子函数,这次包含了min和max,然后再调用一次,真正的min和max 不就有了,当我写代码时候,发现我的子函数要返回两个值,我就发现这个地方可以... -
C语言实现返回字符串函数的四种方法
2020-12-25 23:19:19C语言返回字符串函数共有四种方式,分别如下: 使用堆空间,返回申请的堆地址,注意释放 函数参数传递指针,返回该指针 返回函数内定义的静态变量(共享) 返回全局变量 下面来看看详细的介绍 其实就是要返回一... -
C语言的简单函数定义与调用
2021-05-22 00:39:09//声明print_star函数print_star();//调用print_star函数voidprint_message();print_message();intmax(intx,inty);//------------有参数的声明intc=max(48,12);//调用带参数的函数且有返回值printf... -
C语言—子函数的练习
2018-07-21 17:12:38题目:写几个函数 (1)输入十个员工的姓名和职工号; (2)按员工号由小到大顺序排序,姓名顺序也随之调整; (3)要求输入一个员工号,用折半查找找出该职工的姓名,从主函数输入要查找的职工号,输出职工的姓名;... -
C语言的数组与子函数
2021-12-12 10:43:08数码管显示需要用的一些C语言知识 -
C语言中实用的子函数(持续加料)
2020-04-23 15:59:23【函数的作用】 C语言中的函数的作用是可以将一段经常需要使用的代码封装起来,在需要使用时可以直接调用。 一,判断素数 int prime(int m) { int i,k; if(m==1) { return 0; } k=(int)sqrt(m); /*减少运行时间*/ ... -
c语言学习+子函数
2019-10-25 13:46:420x01 子函数 实际参数 ———(数值)—- 形式参数 注意 c语言是传递值参并非变参。 并非 **引用传递 **–传递变参 (地址) 。 传值调用——传递地址 并非 数值。 例如: scanf ————值参做变参(送的地址&... -
C语言之函数的声明详解
2021-05-21 02:42:22函数不允许重名,C语言中函数没有重载3.函数只要一经定义,就可以在任意函数中调用注意:如果函数定义在它调用之后,那么必须在调用之前,先声明这个函数声明的语法:返回值类型 函数名(参数列表);tips:声明函数其实... -
C语言函数的返回值
2022-03-18 10:23:57对C语言返回值的说明 没有返回值的函数为空类型,用void表示。例如: void func(){ printf("http://c.biancheng.net\n"); } 一旦函数的返回值类型被定义为 void,就不能再接收它的值了。例如. -
C语言实现函数调用的三种方法
2021-01-28 21:53:20在一个.c文件里面进行子函数调用 step1:函数声明 step:mian函数 step:子函数 /******************************** 数组元素之和 法一: 子函数调用 **********************************/ #include<stdio.h&... -
C语言给函数传二维数组
2021-10-30 15:17:22言归正传,给函数传递二位数组,我目前可以掌握的有三种方法: 1.将二维数组压缩成一维数组,然后就可以正常用指针了,用的时候注意一下二维与一维的坐标变换就可以;(我没用,因为我代码已经写好了,不想改!) ... -
C语言中,调用自编子函数对输入数组进行从小到大排序
2022-05-12 17:38:52C语言中,调用自编子函数对输入数组进行从小到大排序 1.程序 #include <stdio.h> int main() { void sort(int array[],int n); int ar[7],i; printf("Please input array:\n"); for(i=0;i<7;i++) ... -
C语言数组作为子函数参数进行传递
2021-04-18 19:03:00经常忘记数组作为子函数参数进行传递的函数声明格式,索性写一篇博文记录一下。 例如以下代码块: 其中*nSendByte作为数组进行传递。在读取数组中特定位置的数值时采用语句: S0BUF = *(nSendByte + i);//i代表第几... -
C语言函数说明与返回值
2021-05-21 11:19:39在学习C语言函数以前,我们需要了解什么是模块化程序设计方法。人们在求解一个复杂问题时,通常采用的是逐步分解、分而治之的方法,也就是把一个大问题分解成若干个比较容易求解的小问题,然后分别求解。程序员在... -
C语言中有多个子函数如何在主函数中通过相应条件调用相应子函数
2020-12-20 17:49:07如题 这是题目 下面是我编的代码 #include<stdio.h> int fun1(int a,int b){ int s=0; s=a+b; printf("%d",s); return 0; } int fun2(int a,int b){ int s=0; s=a-b; printf("%d",s);...int fun4(int a -
C语言关于传入子函数的指针形参的地址改变
2022-04-01 02:09:15C语言关于传入子函数的指针形参的地址改变,自己的一些思考。 -
c语言 向函数传递数组
2020-04-11 19:23:43可以定义一个能接受数组作为函数参数的函数,然后调用这个函数时,可以将一个实际的数组传递给它。 数组作为函数参数时,其定义方式有下列三种: /*函数名param后跟一个空的[],说明param可以接受一个数组*/ void ... -
C语言在子函数中调用malloc申请内存方法分析
2018-06-08 16:10:17#include <stdio.h> #include ...输出的值为‘A’而不是‘B’,调用函数时,char c 被赋值进函数内部进行操作,不会影响到原值, 同样,传入一级指针,智能修改它指向的数据,不能修改它指向的地址 -
C语言 用指针作为函数返回值详解
2020-12-31 22:35:29C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include #include char *strlong(char *str1, char *str2){... -
C语言程序中什么是函数
2021-05-18 10:46:43C语言的函数问题是困扰很多学者的问题的,c程序中也有一定的函数的。那么下面一起来看看学习啦小编为大家精心推荐的c程序中的函数,希望能够对您有所帮助。C语言读书笔记:函数先来看看函数的一般形式,尝试写一个... -
C语言中的函数声明
2021-12-28 20:11:04C语言规定,若对某函数先调用后定义,则在调用该函数之前应先对该被调函数进行声明。 C语言规定,在以下几种情况时可以省略对被调函数的函数声明: (1)当被调函数的函数定义出现在主调函数之前,在主调函数中可以... -
C语言 子函数返回一个局部指针变量的疑惑
2016-11-28 14:19:04输出结果如下图: ...当子函数返回后,局部变量已经超出了作用域啊,为什么在main()函数中还能通过指针rp间接访问变量x呢??为什么第一次访问可以输出12,第二次访问就内存释放了呢,输出一个随机数???? -
子函数是不是最好写到main() 前面啊?
2021-05-26 00:34:35以下是引用JerryChen在2006-9-5 23:00:44的发言:子函数为什么不能定成int型。我在baidu上查的,说要把子函数写道main()函数前面。为什么?函数在调用之前必须先声明,当然如果函数定义在调用之前,声明可以省去.这个... -
关于C语言函数返回数组的问题
2021-05-22 00:37:46关于C语言函数返回一个数组c语言中函数不能直接返回一个数组,但是可以用其他方式实现类似功能,不过需要注意:1、该数组不能是返回函数的局部变量数组,因为局部变量数组在退出函数后会被释放。可以是全局变量,...