故事的起因是这样的,最近在学习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导致的。
好了,今天就到这里吧。