【问题标题】:what are constant pointer to interger or other types什么是指向整数或其他类型的常量指针
【发布时间】:2021-05-11 10:30:27
【问题描述】:

我正在阅读 Kenneth Reek 的书 Pointers on C 关于常量指针的书

什么是指向整数的常量指针?

其中指针是常量(这意味着什么?)它的值不能改变(它的值不应该是cpi=5 的值吗?5 是常量的值,应该读作常量整数或者是常量一件事和整数是另一个 - 请澄清)书继续说but u are free to modify integer to which points to所以基本上我可以做cpi=5和下一行cpi=19那么为什么我需要它们使其保持不变?拥有我们实现的常量指针。

int * const cpi;

作者还说int constant *pci 是一个指向常量整数的指针。所以我可以改变指针值(问:如何改变指针值你能举个例子)

【问题讨论】:

标签: c


【解决方案1】:

这个int * const cpiconst* 的右侧意味着指针本身不能更改为指向其他地方。它的用途并不多,基于指针的查找表几乎是唯一比较常见的用例。它们还用于将指针存储在嵌入式系统上的非易失性闪存中,而不是 RAM。

const int* cpi 是更常见的用法,这意味着指向的数据是只读的。这在编写 const 正确性 函数接口时会用到。

为了让事情更加混乱,C 允许您重新排序类型限定符 const 和类型说明符 int,因此 int const*const int* 的含义完全相同。

【讨论】:

  • 和其他奇怪的非理性规则也让我们可以编写乱码……const long const long const const* const const p; 是有效的 C.
  • 你能给我一个常量指针用法的示例代码吗?
  • @user786 说只读指针与指向只读变量的指针更容易,这样就不会有混淆。前者的一个例子是状态机或函数指针数组形式的switch 替换。你不希望行为在运行时改变,所以你会做类似myfunc_t* const table[] = ...
  • 这条规则属于我不使用的那些 C 特性,因为我的大脑拒绝记住这样一个反直觉的规则(const int * 让我认为这是保持不变的指针)。
  • @RobertoCaboni 在大多数情况下,您也可以使用const int * const。那么指针和指向的数据都是只读的,你不用担心const去哪里了。
【解决方案2】:
#include <stddef.h> // NULL

int main(void) {
    int foo = 42;

    int *ip = &foo;               // can change both `ip` and `*ip`
    int *const icp = &foo;        // cannot change `icp`, can change `*icp`
    const int *cip = &foo;        // can change `cip`, cannot change `*cip`
    const int *const cicp = &foo; // cannot change `cicp`, cannot change `*cicp`

    ip = NULL; // ok
    ip = &foo; // so that next line works
    *ip = -1;  // ok

//  icp = NULL; // nope
    *icp = -1;  // ok

    cip = NULL; // ok
//  *cip = -1;  // nope

//  cicp = NULL; // nope
//  *cicp = -1;  // nope

    int *const *j; // can change `j`, cannot change `*j`, can change `**j`;
}

【讨论】:

  • *icp = -1; // ok 导致 segFault
  • 是的,我的错误@user786。 icp 被初始化为 NULL。代码已编辑,谢谢。
  • 当我什至尝试分配像*icp=5//icp=6 //.. 这样的值时,我的编译器给了我错误可以更改成本只读它的 gcc // icp 是 const 指针
  • 我只收到“未使用的变量”警告(请参阅godbolt.org/z/nxWK9vY6Y)。你的编译器和选项是什么?
  • 也许你打错了一些陈述? *icp = 5; 应该编译... icp = 6; 不应该编译。
【解决方案3】:

指针的值(1)指针指向的值(2)是有区别的。所以指向常量的指针(适用于(2))和常量指针(适用于(1))之间也有区别。最好的解释是官方文档中Pointer declaration页面的“Constness”部分。


但总的来说:

(1) 指针是一个变量,在内存中保存一个槽的地址。 在这个地址下可以是一些值(例如整数),可以使用解引用运算符 * 访问。 因此,当更改指针的值时,您正在更改它指向的内存中的地址,但如果您有一个指向对象的常量指针,您将无法做到这一点: int* const myPointer

(2) 指针指向的值只是内存中的一个值。它也可以是某个变量的值。 因此,您可以使用解引用运算符 *:

更改指针指向的值
int myValue = 5;
int* myPointer = &myValue;

std::cout << *myPointer << std::endl;  // prints: 5

*myPointer = 13;  // changing the value of a variable which pointer points to

std::cout << myValue << std::endl;  // prints: 13

但如果你有一个指向常量的指针,你将无法做到这一点: const int* myPointer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    相关资源
    最近更新 更多