gpt4 book ai didi

常量指针与常量变量

转载 作者:行者123 更新时间:2023-11-30 19:47:19 25 4
gpt4 key购买 nike

我是 C 编程新手,我想知道在这种情况下指针常量与常量变量有何不同:

#include <stdio.h> 
int main(void)
{
int cnt = 0;

char val;
char mystr[20] = “hello there!”;
char *p_str2, str2[20] = “zzzzzzzzzzzzzzzz”;
char* p_mystr = mystr;

p_str2 = str2;

while (*p_mystr != 0x00)
{
val=*p_mystr++;
cnt++;
}

return 0;
}

另外,mystrmystr[2] 有何不同(每个变量的数据类型是什么)以及 p_mystr = mystr[2 有什么问题吗? ]; 这可以写得更好吗(即:为什么 *p_mystr= mystr[2]; 是正确的)?

最佳答案

除非它是 sizeof 的操作数或一元 &运算符,“T 的 N 元素数组”类型的表达式将转换为“指向 T 的指针”类型的表达式,并且表达式的值将是数组的第一个元素。结果不是左值,这意味着它不能成为赋值的目标。

因此,鉴于声明

char mystr[20] = "hello there!";

以下全部正确:

  Expression        Type            Decays to      Result
---------- ---- --------- ------
mystr char [20] char * address of mystr[0]
&mystr char (*)[20] n/a address of mystr
*mystr char n/a value of mystr[0], or 'h'
mystr[i] char n/a i'th character
&mystr[i] char * n/a address of mystr[i]
sizeof mystr size_t n/a 20 (number of bytes in array)

数组的地址与数组第一个元素的地址相同(没有为与数组元素本身分开的 mystr 变量预留存储空间),因此表达式 mystr , &mystr&mystr[0]都返回相同的,但表达式的类型不同; mystr&mystr[0]两者都有类型 char * ,但是&mystr类型为char (*)[20] ,或“指向 char 的 20 元素数组的指针”。

str2 的结果是相同的。

鉴于声明

char *p_mystr;

我们得到以下内容

    Expression      Type        Result
---------- ---- ------
p_mystr char * value in p_mystr
*p_mystr char value of character pointed to by p_mystr
&p_mystr char ** address of p_mystr variable
sizeof p_mystr size_t number of bytes in pointer value

p_str2 的表格是一样的。

现在是匹配类型的问题。 p_mystr = mystr之所以有效,是因为两个表达式的类型均为 char * ; p_mystr最终指向mystr[0] 。同样,*p_mystr = mystr[2]有效1,因为两个表达式的类型均为 charval = *p_mystr++ 相同,尽管在这种情况下请注意 *p_mystr++被解析为 *(p_mystr++) ;增量将应用于指针值,而不是字符值。

请注意像 p_mystr = &mystr; 这样的表达式应该让您诊断出类型不匹配。

您的问题标题提到 const指针和变量,尽管它们没有出现在问题正文中。基本上,对于任何类型 T :

T *p0;                 // p0 is a non-const pointer to non-const T
const T *p1; // p1 is a non-const pointer to const T
T const *p2; // p2 is a non-const pointer to const T
T * const p3; // p3 is a const pointer to non-const T
const T * const p4; // p4 is a const pointer to const t
T const * const p5; // p5 is a const pointer to const t

分解为:

  • 您可以写信给p0 (将其更改为指向其他内容)和 *p0 (更改所指向的内容);
  • 您可以写信给p1p2 (将它们更改为指向其他内容),但您无法写入 *p1*p2 (无法更改所指向的内容);
  • 您无法写信给 p3 (无法将其更改为指向其他内容),但您可以写信给 *p3 (更改所指向的内容);
  • 您无法写信给 p4p5 (不能将它们更改为指向其他内容),也不能写信给 *p4*p5 (无法更改所指向的内容)。

所以,如果你声明了类似的内容

const char *cptr = mystr;

您无法修改 mystr 的内容通过cptr变量,即使 mystr未声明const本身。

请注意,尝试走其他路,例如

const int foo = 5;
int *fptr = (int *) &foo;
*fptr = 6;

调用未定义的行为;它可能工作也可能不起作用,具体取决于实现(语言定义允许实现将 const 限定的对象放入只读内存中)。

<小时/> 1. 如果 p_mystr也就是说,指向某个有效的地方。

关于常量指针与常量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22229308/

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