正文
c语言函数加上指针吗 c 语言 函数指针
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
c语言函数返回字符串时必须要用指针吗?如果返回结构体呢?函数在返回那些类型值时必须要用指针?
所谓函数类型是指函数返回值的类型。在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中完成计算平均成绩和统计不及格人数的工作并输出结果。
由于本程序全部采用指针变量作运算和处理,故速度更快,程序效率更高。
C语言需要加指针符号吗?
当你想保存一个地址的时候不加 *:
Int a = 0;
p = a;
当你想取指针里的值的时候加 * :
int b;
b = *p; == b = *(a) == b = 0; // 就是说把a地址保存的值取出来。
当*p的值还是指针的时候:
int *p = NULL;
int *q = NULL;
int a = 0,b =1 ;
q = a;
p = q;
*p= a; // 结果就是q 指向a , p指向q; (*(*p)) 等于 0;
p= a; // 结果就是p指向a; q 也指向a; p
c语言 自定义函数里面有指针?
就是把两个指向double类型的指针赋给P3,P4啊
比如是在主函数里调用的
double a,b,*c,*d;
double x[50]={0},y[20]={0};
a=b=0.5;
c=a;
d=b;
然后 调用就可以了
NH3H2O(5, a, b, c, d);
或者
NH3H2O(20, 5.2, 8.256, x, y);
c语言,函数里的指针问题?
这个其实很好理解
只需要把%s,%c,%p放在一起看
首先%s是最常见的很好理解,就是告诉程序后面的变量是一个字符串,在C语言中也就是字符数组,类型是char*或者char[],换句话说,你告诉程序我会给你一个指针,你去读这个指针指向的值。
然后%c是告诉程序后面的变量是个字符,类型是char,差别已经很明显了,这时候你告诉程序我给你提供一个字符,你给我在%c处打印出来。然而你给的却是一个指针,那程序就直接把你给的指针指向的地址本身当成字符打印出来了。但是一个地址肯定不止一个字节,也就是说超过了char应该有的大小,这时候程序会直接忽略了超出大小的部分,只读第一个字节。
如果你同时使用%p,告诉程序,你会提供一个指针,直接把这个指针指向的地址给我打印出来。把输出的地址最后两位的16进制数查ascii表,换算成字符,你会发现,刚好就是前面%c打印出的字符。
标题c语言中为什么要使用函数指针,直接调用函数不就可以吗?
函数指针一般用来做回调的c语言函数加上指针吗,一般多线程用的多,因为线程之间,栈空间不一样。还有就是封装好的程序,做回调的,比如c语言函数加上指针吗我写了一段程序,想要给c语言函数加上指针吗你用,如果我内部没有回调,c语言函数加上指针吗你就要改动我的程序。但我这样写,我的执行过程是123,二这个步骤,我用函数指针封装起来,如果等于空就不执行,然后你来用,只需要把我的函数指针,指向你的函数,我这个程序是不是就可以不改代码,然后把你的代码加到中间了,所以,函数指针除了线程中,通过传递消息,根据消息相互调用,之外,也是封装的一大利器,如果管理的好,还可以减少代码雍种,写的好,增加可读性。当然你可以不用,也能开发同样效果的东西,难度要大很多,特别是代码到千行以上
C语言函数前面加个指针是什么意思
表示返回值类型为指针。
char* strset(int n)
{
char* s = (char*)malloc(20*sizeof(char));
sprintf(s,"%d",n);
return s;
}
调用该函数时c语言函数加上指针吗,返回值就是s字符串c语言函数加上指针吗的指针。
c语言函数加上指针吗的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c 语言 函数指针、c语言函数加上指针吗的信息别忘了在本站进行查找喔。