c语言函数指针指针与函数问题

查看: 689|回复: 17
其实这是一个C语言函数指针相关的问题,这个问题在我脑子里一直盘旋了很久,恳请大神解答我心中的疑惑~
主题帖子精华
高级会员, 积分 752, 距离下一级还需 248 积分
在线时间202 小时
例如我现在看的原子哥的内存管理实验(探索者开发板)
其中有如下的一个结构体
1&这是该实验中的一个结构体
[C] 纯文本查看 复制代码struct _m_malloc_dev
(*init)(u8);
/* 就以这个来说明吧 */
(*perused)(u8);
*membase[SRAMBANK];
*memmap[SRAMBANK];
memdry[SRAMBANK];
2&以其中第一个成员为例,我们对这个函数指针进行初始化, 初始化结构体指针为my_mem_init
3&于是:我们就需要定义如下一个函数
void my_mem_init(u8 memx)
请问大神:按照前面的函数指针定义:我觉的这个函数应该采用如下形式
void (*my_mem_init)(u8 memx)
是我哪里理解错了,恳请大神指教
回复【7楼】小温:
---------------------------------
感谢这位大神的细心指导~
电子爱好者
主题帖子精华
高级会员, 积分 752, 距离下一级还需 248 积分
在线时间202 小时
回复【7楼】小温:
---------------------------------
感谢这位大神的细心指导~
电子爱好者
主题帖子精华
金牌会员, 积分 1477, 距离下一级还需 1523 积分
在线时间213 小时
struct&&&_m_malloc_dev&&&malloc_
void&my_mem_init(u8&memx)
{
}
malloc_dev.init&=&my_mem_
函数名可以直接赋值给函数指针变量
思想很重要,无论做人还是编程!
主题帖子精华
高级会员, 积分 752, 距离下一级还需 248 积分
在线时间202 小时
回复【2楼】小温:
---------------------------------
是啊,函数名可以直接赋值给函数指针变量,
那么如上的void&&(*init)(u8)&函数直接将init换成my_mem_init,不就变成了&void&(*my_mem_init)(u8)了嘛
电子爱好者
主题帖子精华
在线时间652 小时
回复【3楼】liuchang:
---------------------------------
结构体里&&表明&此处是指针类型
函数名即是指针&&
剩下的自己想吧
道不同,不相与为谋
主题帖子精华
在线时间535 小时
自己对指针也不是很熟悉,以下仅是当前认识,自己也不十分确认,欢迎讨论
void&perused(u8);&&//一般函数定义,perused为函数名(已固定)
void&*perused(u8);&&//返回(void&*)指针函数,perused为函数名(已固定)
void&(*perused)(u8);&&//一般函数定义,perused为指向函数的指针,可被重新赋值
而函数名本身就是一个指针
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
主题帖子精华
在线时间146 小时
int&*p;p是int型指针,那么p指向的就是int型变量。定义这种变量时就是这样:int&&a;
同理,
void&&(*init)(u8);init指向的就是void&&XX(u8)型的函数。定义这种函数时就是这样:void&f(u8&a);
主题帖子精华
金牌会员, 积分 1477, 距离下一级还需 1523 积分
在线时间213 小时
回复【3楼】liuchang:
---------------------------------
结构体里面的成员变量只是用作声明,你没有定义一个结构体变量的话,编译器是不会为每个成员分配内存空间的,也就是你不能直接在结构体里面对其成员进行初始化,如果你要进行&&“void&&(*init)(u8)&函数直接将init换成my_mem_init,不就变成了&void&(*my_mem_init)(u8)”&&&这项操作,那么“my_mem_init”&也只是一个指针变量,到后面,你还要对这个指针进行赋值
思想很重要,无论做人还是编程!
主题帖子精华
在线时间535 小时
回复【6楼】jiutianshenjian:
---------------------------------
如果直接void&&init(u8);和void&&(*init)(u8);有什么区别呢?直接void&&init(u8);时init是什么含义,进行void&f(u8&a);类函数赋值是否可以?
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
主题帖子精华
高级会员, 积分 752, 距离下一级还需 248 积分
在线时间202 小时
回复【9楼】龙之谷:
---------------------------------
按照我现在的理解:例如我们定义指针p,是采用如下方式&
int&*p,
而我们在使用这个指针的时候,却不用加修饰,a=p(而不是写成a=(int&*)p
这也就是为什么我们使用void&my_mem_init(u8)(而不是(*my_mem_init)(u8)的原因了吧)
电子爱好者
主题帖子精华
高级会员, 积分 752, 距离下一级还需 248 积分
在线时间202 小时
还请各位大神看看小弟理解的是不是有问题~
电子爱好者
主题帖子精华
在线时间535 小时
回复【10楼】liuchang:
---------------------------------
类比int&a;
int&*p;即(int&*)p;
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
主题帖子精华
在线时间146 小时
回复【9楼】龙之谷:
---------------------------------
函数名是函数的地址是个常量。
函数指针是变量,可以被赋值。
主题帖子精华
在线时间535 小时
回复【13楼】jiutianshenjian:
---------------------------------
多谢指导,我概念有些混淆了,还需要补充一下C了
--------------------------------------------------------------
搜了一下函数名,留个函数名与函数指针的链接备用:/CBDoctor/archive//2725219.html
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
主题帖子精华
在线时间146 小时
回复【10楼】liuchang:
---------------------------------
a=(int&*)p&是强制转换,跟本贴关系不大。
你的例子用变量来说是这样:
有个指针int&*p1;你想给这个p1赋值(或是你说的初始化)。
你又int&*p2;然后你使p1=p2;这就叫赋值了?
p1,p2都是未被初始化的指针,你怎么能拿p2去初始化p1?
你应该这样做:
int&a;
int&*p&=&&a;
这样p就被初始化了,有了具体的指向。
函数指针同理:
你想初始化void&&(*init)(u8);
你就得定义一个void&&abc(u8&c);
然后可以使init&=&&
由于函数名本身就是函数的地址,所以就写成init&=&就可以了.
主题帖子精华
高级会员, 积分 752, 距离下一级还需 248 积分
在线时间202 小时
回复【15楼】jiutianshenjian:
---------------------------------
首先感谢大神指导~
如大神所说:函数名本身就是地址
那不应该使用init=&abc嘛
那init=&abc,不就是地址的地址嘛,那不应该是二级指针的概念了吗
小弟就是对这个没有办法理解~(其实我一开始提问的问题也就是这个问题)
电子爱好者
主题帖子精华
在线时间146 小时
回复【16楼】liuchang:
---------------------------------
这个你可以参考楼上给的资料。我理解这里就是这么规定的。
数组名本身也是地址,加&符号也是同一个地址,只不过范围大了。
主题帖子精华
初级会员, 积分 122, 距离下一级还需 78 积分
在线时间7 小时
不错。。。。。
Powered byC语言指针 - 简书
int型变量当指针用
void func(char* p[])
*p="ABCDEF";
int main()
int A; //int 型用作指针
func((char**)&A);
cout&&(char*)A&&
char*、char[]、char[20]、char&做函数参数时的异同
只有char&在函数栈中不占用空间,其他均会在函数栈中开辟空间,有一次形参——实参匹配赋值的过程。
故,自以为从编译器的角度,应该把char&解释为传址,其他均解释为传值(char*、char[]也解释为传值,因为有指针的赋值)。
const在指针强制转换面前形同虚设
void func(const char *p)
char *p1 = (char*)p;
指针、函数、数组等稀奇古怪的声明方式
void(*signal(int signo,
void(*func)(int)))(int);
指针与数组名本质区别
int A[20];
int *p = A;
p[1] = *(p+1)
A[1] = *(A+1)
//比指针写法在取值时少一次间接取址
指针与数组何时相同
ANSI C规定:函数参数中数组写法等同于指针,但不包括其所指类型。
例:int func(char *p[5])
int func(char (*p)[5])不同。
ANSI C规定:在表达式中,数组|指针 下标写法等同于偏移量写法。
用字符串初始化指针和数组的区别
char *p = “ABCDEFG”;
char p[] = “ABCDEFG”;
//前者放于只读段内,不可修改,后者依据p[]的特性可能是静态存储区/栈。
函数形参——实参匹配过程和返回值的本质
想实现传统传址的方法就是:地址赋值。
赋值时,不用考虑空间有效性问题,只需考虑值对不对的问题。
赋值之后,值所表示的地址在新的空间里必须是有效的。
const类指针赋值问题
const int *p1; int *p2;
p1=p2;(正确)
p2 = p1;(错误)
const int **p1; int **p2;
p1=p2;(错误)
p2 = p1;(错误)
ANSI C解释:
如果相互赋值的是两个指针,则
1.两个操作数都是指向有限定符或无限定符的相容类型的指针 (或)
2.左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。
但是:在强制转换面前,const是浮云。
更多详细介绍参见:
社区搬运工2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2007年6月 总版技术专家分月排行榜第三
2007年6月 VC/MFC大版内专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 c语言指向函数的指针 的文章

 

随机推荐