C++如何向形参为const uint8_t *const s[]的函数传递数组?
问题1:为什么必须定义pointertoX中间变量才能完成传参
首先拆解你用到的函数参数类型:void fire(const uint8_t *const s[])在C/C++中,数组形参会自动退化为指针,所以该参数实际等价于const uint8_t *const *s,即指向「指向const uint8_t的const指针」的二级指针。
你定义的unsigned char X[10]是数组名,它的属性和普通指针有两个核心差异导致不能直接取地址传参:
- 数组名是右值指针常量,本身不占用可寻址的内存空间,无法直接对右值取地址
- 即使强行写
&X,得到的类型是unsigned char (*)[10](指向长度为10的unsigned char数组的指针),和形参要求的二级指针类型完全不匹配,编译会直接报错
而你定义的pointertoX是左值指针变量,类型为unsigned char *,占用可寻址的内存空间,对它取地址得到的unsigned char **类型可以隐式转换为形参要求的const uint8_t *const *类型,因此可以正常传参。
问题2:更简洁的实现方式
有两种常用的无额外单独变量的写法,适配不同场景:
- 写法1:使用复合字面量直接构造临时指针传参(C++11及以上版本支持)
// 不需要额外定义pointertoX变量,直接传参 fire(&(unsigned char *){X});
- 写法2:构造指针数组传参(更适配ffmpeg sws_scale接口使用场景)
sws_scale本身要求传入的是存放各平面数据指针的数组,这种写法可读性更高,扩展多平面数据(如YUV格式)也更方便:
uint8_t *src[] = {X}; fire(src);
额外注意
你当前fire函数中cout<<*s<<endl;的写法会把*s(unsigned char*类型)当作C风格字符串处理,输出的是内存地址对应的字符串内容而非数值,如果你要输出数组首元素的数值,需要改为cout << (int)**s << endl;。
内容的提问来源于stack exchange,提问作者user3807476
相关产品推荐
相关产品推荐

