函数指针和函数指针取地址

       故事的起因是这样的,最近在学习ffmpeg,发现一个小伙伴在写ffmpeg取内存数据的时候是这样写的:  

   avio_alloc_context(aviobuffer, 32768, 0, NULL, &read_packet, NULL, NULL);

       稍微熟悉一点的小伙伴可以发现问题,read_packet本身就是一个函数指针,但是在这里又使用了取地址符。这样不就是二级指针了吗?但是实际上运行是没有问题的。所以对于这个问题确认了一下,发现这样应该是编译器优化过的,虽然理论上是二级指针,但是实际上仍然是一级指针。我这边也代码测试了一下:

#include<iostream>
#include <stdlib.h>
using namespace std;

int read_packet(char *op, char *buff, int buffLenth)
{
	return buffLenth;
}

int main()
{
	printf("%x\n",read_packet);
	printf("%x\n",&read_packet);

	system("pause");
	return 0;
}

输出的结果是一样的。

然后这里又自然的想到数组是类似的,那会不会也有着这样的问题呢?所以我这边也测试了一下:

#include<iostream>
#include <stdlib.h>
using namespace std;


int main()
{
	char sz[100];
	printf("%x\n",sz);
	printf("%x\n",&sz);

	system("pause");
	return 0;
}

结果果然是一样的。网上查了一下,这个无论对于函数名和数组名,他们的里面是没有存数据的,和单纯的变量是不一样的。所以取地址符不会取到二级指针。另外附加一个小彩蛋:如果使用cout直接输出数组名称结果不一样哦,有可能是cout自适应成%s导致的。

好了,今天就到这里吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值