声明 short 指针应写为 short ptr,避免 short p, q(q 非指针),推荐单行单声明或 short p, q;不可将 int 直接赋给 short,因类型不兼容易致未定义行为。

怎么声明一个指向 short 的指针
直接写 short*,不是 short int*,也不是 signed short* —— 三者在绝大多数编译器下等价,但标准只保证 short 和 short int 是同一类型,而 short 是更简洁、更常见的写法。
常见错误是漏掉星号位置,比如写成 short *p = &x; 看似没问题,但如果和多个变量连写就翻车:short* p, q; 中只有 p 是指针,q 是普通 short 变量。建议每行声明一个,或用括号强调:short *p, *q;
- 正确:
short x = 42; short* ptr = &x; - 危险:
short* p, q;→q不是指针 - 可读性更好:
auto ptr = &x;(C++11 起,类型自动推导,推荐用于局部简单场景)
为什么不能把 int* 直接赋给 short*
因为 short 和 int 通常大小不同(short 多为 2 字节,int 多为 4 字节),强行 reinterpret_cast 或 C 风格转换会破坏内存访问边界,轻则读错值,重则触发未定义行为(UB),尤其在启用严格别名检查(如 -fstrict-aliasing)的编译器下可能被优化掉。
典型错误现象:int i = 0x12345678; short* sp = (short*)&i; printf("%hx", *sp); 输出不可靠,取决于字节序和对齐,且 GCC/Clang 可能静默优化掉该读取。
立即学习“C++免费学习笔记(深入)”;
- 安全替代:用
memcpy拆解低 2 字节:short s; memcpy(&s, &i, sizeof(s)); - 若真需指针级操作,必须用
reinterpret_cast<short>(addr)</short>并确保地址对齐(short通常要求 2 字节对齐) - 注意:
sizeof(short)不一定是 2 —— 标准只要求 ≥sizeof(char)且 ≤sizeof(int),实际中几乎总是 2,但嵌入式平台例外
short* 在数组和函数参数里怎么传才不丢精度
传数组时,short arr[10] 退化为 short*,没问题;但若函数形参写成 void func(short* p),调用方传 int arr[10] 就是错的 —— 类型不匹配,编译器(开启 -Wall)会警告 invalid conversion from ‘int*’ to ‘short*’。
容易被忽略的是:函数内用 ptr[i] 访问时,编译器按 short 步长(2 字节)算地址,如果底层内存其实是 int 布局,就会跨数据边界读取。
- 正确做法:函数明确按
short设计,调用方也传short数组 - 若需兼容不同整型,用模板:
template<typename t> void process(T* data, size_t n);</typename> - 避免用
void*+ 强转,那等于放弃类型安全,调试时很难定位越界或截断问题
用 std::vector<short></short> 还是裸 short* 管理动态内存
除非你在写底层驱动、高频实时模块,或者受制于某套 C 接口,否则优先用 std::vector<short></short>。裸 short* 配合 new short[n] 容易忘 delete[],且无法自动随作用域释放。
性能上,两者底层内存布局完全一致(连续 short 序列),vector 的额外开销仅是一个指针+两个 size_t(共 24 字节),现代编译器还能很好内联 operator[]。
- 裸指针适用场景:与 C 库交互(如 OpenGL 的
glVertexPointer)、自定义内存池、零分配关键路径 - vector 更安全:支持移动语义、异常安全、迭代器失效规则清晰
- 注意:不要返回局部
vector的.data()给外部长期持有 —— vector 一析构,指针就悬空
最常被绕开的问题是:short 的符号性。它默认是 signed short,但某些旧代码或协议里会把它当无符号用,这时候应该显式写 unsigned short*,而不是靠注释或约定 —— 编译器不会帮你检查位宽或符号扩展逻辑。










