You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]是数组名,它的属性和普通指针有两个核心差异导致不能直接取地址传参:

  1. 数组名是右值指针常量,本身不占用可寻址的内存空间,无法直接对右值取地址
  2. 即使强行写&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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:00:02