c - 为什么 double ** 类型的参数与 const double ** 类型的参数不兼容

标签 c

<分区>

当我将 double ** 传递给需要 const double ** 的函数时,我收到一条消息,提示我从 gcc 传递了一个不兼容的指针类型。这让我感到困惑,因为 const double ** 只是对传入参数的使用施加了更多限制。这与将 double * 传递给需要 const double * 的函数有何本质区别?

稍后添加:将 double ** 传递给需要 const double * const * 的函数同样有问题,知道这会出什么问题吗?

最佳答案

如果您按值将指针传递给 const T,则该函数无法编辑调用者的指针,也无法编辑 T,因此一切都是安全的。

如果您按值传递指向 const T 的指针,该函数不能编辑 T,但它可以 编辑第二个指针。由于指针对象类型不同(const vs mutable),这可能会造成严重破坏。

static const double PI = 3.14;
void function(const double** p)  {
  *p = &PI; //point at the const double PI
}
int main() {
    double* p;
    function(&p); //pass pointer to pointer to double
    *p = -1; //changing a static const global!  That's bad!
} 

Matt McNabb观察到如果参数是 const double*const* 那么 C++ 会允许它,认为 C 不允许,可能是由于简单的疏忽。

关于c - 为什么 double ** 类型的参数与 const double ** 类型的参数不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28286401/

相关文章:

c - 双人楼层(time_t)

c - 字符串中的 `% a` 读取为内存中的一个点

c++ - 用于将二进制文件嵌入 obj 文件的命令行工具

python - 如何使用 Python C API 从对象的方法访问常量?

c - 字符串声明中 `char *str`和 `char str[]`的区别

c - 了解程序的输出

c - x86_64 上的缓冲区溢出 - 回到 libc 攻击 (linux)

c - c中的图及其实现

c - rle压缩算法c

c - Hop_Size在aubio中的含义