扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
有函数: int fun(int a,int b);
公司主营业务:成都网站设计、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出西峡免费做网站回馈大家。
要定义指向该函数的指针
对比指向 int a; 的指针
int *p; p = a;
p的定义是怎么来的?
首先要保证p是一个指针类型
写下(*p),
然后,考虑下p的基类型,
p的基类型就是变量a的类型int
将int 放在(*p)前面就行了
int (*p);
括号可以省略,就成了 int *p;
同理
想要实现 pf = fun;
(*pf) 将pf定义为一个指针,
将fun的类型作为pf的基类型
fun相当于一个 int (int a,int b)类型的量
int (int a,int b) (*pf);
基类型中有圆括号和中括号要后移
int (*pf)(int a,int b) ;//括号不能省略
pf = fun;
调用时
(*pf)(3,4); pf(3,4)都可以
/*
函数指针,关键是后面两个字“指针”,顾名思义,是一个指向函数的指针
原理:函数在创建好了后,函数的代码会在内存中占有个位置,这时我们创造一个指针来指向这个地址,这个指针就叫函数指针
函数指针不可以移动,想要移动指针的位置来指向函数的下一个指令的想法是错误的
函数指针的要求,
1,首先这个指针,要和函数的返回类型一样
2,指针的*和名字,要用小括号括起来//不括起来就是指针函数了,意思就变成,函数返回一个指针了
3,最右边的小括号里形参位置的类型,形参的个数,也要和函数定义时的形参一致,只要类型,不要形参名即可,
但是加上形参名也可以,没毛病,看上去也更清晰
*/
#include
void swapchar(char *a, char *b)
{
char t;
t = *a;
*a = *b;
*b = t;
}
void swapchar2(char * a2, char * b2)
{
printf("this is swapchar2");
}
int main(void)
{
char chf = 'a', chg = 'j';
void(*p)(char * a, char * b);//定义函数指针、形参名字a、b可有可无,但有的话看上去更清晰,只要函数定义的类型、参数类型、以及参数个数,与这个指针一致,那么这个指针p,就可以指向它
p = swapchar;//p指针接管swapchar函数,只要给函数名字,就可以给过去了
printf("chf=%c,chg=%c ", chf, chg);
p(chf, chg);
printf("chf=%c,chg=%c ", chf, chg);
p = swapchar2;//这里把swapchar2函数的地址,给了p,这时p从swapchar地址,转移到了swapchar2这里。
p(chf,chg);
return 0;
}
1、使用场景
使用指针时,必须将它指向一个变量的地址或者为它分配空间方能使用,如下所示:
#includestdio.h
#include stdlib.h
int main(int argc, char const *argv[])
{
int a[5]={0,1,2,3,4};
int *b,*d;
int c=2;
int *e=a; //e指向a数组首地址
//*b=2; 无法直接初始化
//printf("%d\n", *b);
e=e+2; //移动两个地址单元
d=c; //d指向c的地址来表示值
c=4; //修改原c变量的值,d指针的值会发生改变
b=(int *)malloc(sizeof(int));//为b分配一个int型空间来直接存储值
*b=2;//分配空间后可以直接赋值了
printf("this is e,b,c,d :%d %d %d %d\n",*e,*b,c,*d);
2、类型说明
(1)int *a :表示一个指向int型变量的指针,指向的是变量的地址单元
(2)char *b:表示一个指向char变量的指针
*a表示的是这个指针指向地址的值,a为此指针本身的地址,这点要明确,一般用*(a+1)、*(a+2)来表示值,如:
int nums[5]={0,1,2,3,4};
int *a=nums;
printf("%d %d %p\n",*a,*(a+1),a);
扩展资料:
指针的运算
指针指向变量地址,若原变量的内容发生了变化,它本身也会发生变化,指针之间的运算一般为值运算和地址运算
(1)值运算:直接通过*运算方式,像a+*(a+1),结果为第一个元素与第二个元素相加。
int nums[5]={0,1,2,3,4};
int *a=nums;
(2)地址运算:通过a+i的方式.指针会指向a的下i个地址。
int nums[5]={0,1,2,3,4};
int *a=nums;
a=a+2;
printf("%d\n",*a);
结果输出2。
参考资料来源 :指针-百度百科
这个其实很好理解
只需要把%s,%c,%p放在一起看
首先%s是最常见的很好理解,就是告诉程序后面的变量是一个字符串,在C语言中也就是字符数组,类型是char*或者char[],换句话说,你告诉程序我会给你一个指针,你去读这个指针指向的值。
然后%c是告诉程序后面的变量是个字符,类型是char,差别已经很明显了,这时候你告诉程序我给你提供一个字符,你给我在%c处打印出来。然而你给的却是一个指针,那程序就直接把你给的指针指向的地址本身当成字符打印出来了。但是一个地址肯定不止一个字节,也就是说超过了char应该有的大小,这时候程序会直接忽略了超出大小的部分,只读第一个字节。
如果你同时使用%p,告诉程序,你会提供一个指针,直接把这个指针指向的地址给我打印出来。把输出的地址最后两位的16进制数查ascii表,换算成字符,你会发现,刚好就是前面%c打印出的字符。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流