为何修改const指针参数未触发编译警告或错误?
问题原因解析
- 你写的
const uint32_t *pData,本质是指向const数据的指针——它只限制了不能通过这个指针修改指向的uint32_t内容,但指针变量pData本身是完全可以修改的。函数的参数是原指针的副本,修改这个副本的指向属于合法操作,编译器自然不会触发警告。 - 如果要让指针本身的指向不能被修改,得把
const放到*的右边,写成uint32_t *const pData。这时如果在函数里修改pData的指向,编译器才会报错或警告。 - 举个直观的对比:
- 允许修改指针指向、但不能修改指向内容的写法(你的代码):
static void CalcCRC(const uint32_t *pData, uint8_t noWords) { pData = pData + noWords; // 合法,无警告 // *pData = 0; // 非法,会触发警告,因为指向的内容是const } - 禁止修改指针指向、但允许修改指向内容的写法:
static void CalcCRC(uint32_t *const pData, uint8_t noWords) { pData = pData + noWords; // 非法,触发编译警告/错误 *pData = 0; // 合法,无警告 }
- 允许修改指针指向、但不能修改指向内容的写法(你的代码):
内容的提问来源于stack exchange,提问作者ElecDesigner
相关产品推荐
相关产品推荐

