gpt4 book ai didi

c - 为什么必须将 int 指针绑定(bind)到变量而不是 char 指针?

转载 作者:太空宇宙 更新时间:2023-11-04 00:15:39 24 4
gpt4 key购买 nike

我不确定我的问题措辞是否正确,但在这里拼写出来:

char * cp = "this is a char pointer";

上面的代码,根据我目前有限的理解,似乎可以接受。但是,下面的代码似乎 Not Acceptable :

int * ip;  // UPDATED
*ip = 5; // UPDATED

相反,我必须这样说:

int x;
int * ip;
ip = &x;
x = 5;

因此,对于字符串,我可以在拼写出来后立即将指针初始化为指向字符串文字。我不必用任何其他变量来标识该字符串文字......但这也许是因为指针和数组之间的密切关系,而我实际上同时用同名的隐式数组来标识它? (我试图部分回答我自己的问题)

但是对于整数,我不能只指向一个漂浮在内存中的整数值。我必须给那个整数值一个变量名并指向变量位置。

我猜这可能与堆栈与堆存储的差异有关?我还有点弱...

任何进一步的见解将不胜感激!谢谢!

最佳答案

你的理解是正确的。字符串文字实际上是一个 char 数组,取其值实际上会产生指向其第一个元素的指针。您可以对任何文字数组执行此操作(但没有您拥有 char 数组的语法糖)。

char *s = "String";        // right side is array of char
int *x = (int []){1, 2}; // right side is array of int

同样,以下都是不正确

char *s = 'S';
int *x = 1;

请注意“String”和“S”之间的区别。前者是一个char数组,而后者只是一个int。

但是(正如 Keith 最先提到的那样),字符串文字和文字数组(通常称为复合文字)具有不同的存储持续时间。特别是,字符串文字始终具有静态存储持续时间;但是复合文字具有自动或静态存储持续时间,具体取决于它是否出现在函数中。这意味着如果你从一个函数中获取一个指向复合文字的指针:

  • 您可以阅读并更改更改它直到执行超过其 block 的末尾,并且
  • 执行结束后,您不得以任何方式访问它。相反,对于字符串文字,您之后可以读取它们,因为它们具有静态存储。

在这方面,获取一个指向文字数组的指针与仅声明一个数组非常相似(例如,除了 sizeof()):

int x[] = {1, 2};

关于c - 为什么必须将 int 指针绑定(bind)到变量而不是 char 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8371968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com