重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
搞定
创新互联成立于2013年,先为义县等服务建站,义县等地企业,进行企业商务咨询服务。为义县企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
额 , 现在可以直接用b , 因为 数组 变量b 本身是不能修改的, 而且 函数结束后 b 的生命就结束了。
所以 我在 b的前面 加了static
for(i=r;*(ch+i)!='\0';i++) //找到 目标函数的结尾
for(j=0;j=i-r+1;j++) // i-r 是 从m到最后字符串的长度
*(b+j)=*(ch+r-1+j); //拷贝
char * x= b;
return x;
复制以下的
#includestdio.h
void main()
{
char a[20];int m=0;char*fuzhi(char*,int);
printf("输入字符:");
gets(a);
printf("输入起始位数:");
scanf("%d",m);
printf("%s\n",fuzhi(a,m));
}
char *fuzhi(char*ch,int r)
{static char b[20];int i,j;
for(i=r;*(ch+i)!='\0';i++)
for(j=0;j=i-r+1;j++)
*(b+j)=*(ch+r-1+j);
char * x= b;
return x;
}
标准库返回指针, 一般有三种情况
一种是 返回的指针,就是你传入参数或者其中的一部分。
典型的是字符串操作函数,比如 strcmp, strcpy, strstr等等。
第二种,是返回的指针,需要调用特定的函数去释放。 比如fopen函数返回的FILE*,需要调用fclose去释放。
第三种, 返回的指针,需要自行调用free去释放。
比如 malloc realloc 类的申请内存函数
以及strdup一类的复制函数。
每个标准库函数,都有自己的规范。 按照要求操作就不会内存泄露。否则就会产生。
您好,很高兴能为您解决问题。
一般来说是的。还有一种方法:返回数组。虽然C语言返回不能为数组,但是还是可以实现的:传递数组的指针,接收的时候再用*(返回值)就可以收到了。
希望我的解答能帮到您,望采纳!
你的写法有问题...
char ele[200];
s=ele;
ele为函数内部定义的定长数组,等函数过程结束,对应的内存就会被自动释放,所以这样写是不对的
加了printf也不对,只是printf可能延迟了ele的释放
所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。
定义指针型函数的一般形式为:
类型说明符 *函数名(形参表)
{
…… /*函数体*/
}
其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。
如:
int *ap(int x,int y)
{
...... /*函数体*/
}
表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。
【例】本程序是通过指针函数,输入一个1~7之间的整数,输出对应的星期名。
main(){
int i;
char *day_name(int n);
printf("input Day No:\n");
scanf("%d",i);
if(i0) exit(1);
printf("Day No:%2d--%s\n",i,day_name(i));
}
char *day_name(int n){
static char *name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
return((n1||n7) ? name[0] : name[n]);
}
本例中定义了一个指针型函数day_name,它的返回值指向一个字符串。该函数中定义了一个静态指针数组name。name数组初始化赋值为八个字符串,分别表示各个星期名及出错提示。形参n表示与星期名所对应的整数。在主函数中,把输入的整数i作为实参,在printf语句中调用day_name函数并把i值传送给形参n。day_name函数中的return语句包含一个条件表达式,n值若大于7或小于1则把name[0]指针返回主函数输出出错提示字符串“Illegal day”。否则返回主函数输出对应的星期名。主函数中的第7行是个条件语句,其语义是,如输入为负数(i0)则中止程序运行退出程序。exit是一个库函数,exit(1)表示发生错误后退出程序,exit(0)表示正常退出。
应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。如int(*p)()和int *p()是两个完全不同的量。
int (*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。
int *p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。
对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。
在ANSI C标准中允许用结构变量作函数参数进行整体传送。但是这种传送要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。这时由实参传向形参的只是地址,从而减少了时间和空间的开销。
【例】计算一组学生的平均成绩和不及格人数。用结构指针变量作函数参数编程。
struct stu
{
int num;
char *name;
char sex;
float score;}boy[5]={
{101,"Li ping",'M',45},
{102,"Zhang ping",'M',62.5},
{103,"He fang",'F',92.5},
{104,"Cheng ling",'F',87},
{105,"Wang ming",'M',58},
};
main()
{
struct stu *ps;
void ave(struct stu *ps);
ps=boy;
ave(ps);
}
void ave(struct stu *ps)
{
int c=0,i;
float ave,s=0;
for(i=0;i5;i++,ps++)
{
s+=ps-score;
if(ps-score60) c+=1;
}
printf("s=%f\n",s);
ave=s/5;
printf("average=%f\ncount=%d\n",ave,c);
}
本程序中定义了函数ave,其形参为结构指针变量ps。boy被定义为外部结构数组,因此在整个源程序中有效。在main函数中定义说明了结构指针变量ps,并把boy的首地址赋予它,使ps指向boy数组。然后以ps作实参调用函数ave。在函数ave中完成计算平均成绩和统计不及格人数的工作并输出结果。
由于本程序全部采用指针变量作运算和处理,故速度更快,程序效率更高。
这种方式叫做“用指针函数*creat()的返回值来传递动态内存”,这是一个C语法
首先你要注意,子函数*creat()用了malloc动态申请内存,而return返回的是指针变量所指向的地址,而不是指针!相当于将你所申请的动态内存返回给主函数
int
*fun(void)//这里是指针函数
{
int
*p
=
(int
*)
malloc
(int);//动态申请内存//p在这里指向了一块合法内存的地址
return
p;
}
void
main(void)
{
int
*q
=
NULL;
q
=
fun();//fun()返回指针p所指向的地址,(指针p是在栈上创建的,所以*fun()函数运行完,指针所分配的内存被系统自动释放)这时q指向p,得到了malloc所申请到的内存
free(q);//释放动态内存
}