1

任何人都可以向我解释以下两个代码块之间的区别:

func1 (...)
{
    int32_t index;
    const int32_t *p;
    p =& (index);
}
func2 (...)
{
     const int32_t s;
     s=10;  
}

可以声明一个 const 指针,然后给它赋值,但不能声明一个普通变量,然后给它赋值。有人可以向我解释一下吗?

我收到一个 pc-lint 错误,我必须在函数内声明 const 变量,但我做不到。我怎样才能摆脱这个错误?

太感谢了。

4

3 回答 3

2

那是因为他们没有做同样的事情(使用Tas type 因为我基本上很懒):

const T *p; // non-const pointer to const T.
const T s;  // const T.

将前者视为具有约束力可能会有所帮助[const T] [*p]

如果你想要一个const 指针,你可以使用以下方法之一:

T * const p;         // const pointer to non-const T, [T*] [const p]
const T * const p;   // const pointer to const T, [const T*] [const p].
于 2020-08-29T08:14:57.653 回答
1
int i=0;
const int *p=&i;
*p = 10; /*error*/

这是incorrect,因为 p 已声明pointer to constant int,所以您不能通过 p 更改 p 指向的整数值。

int i=0;
int const *p=&i;
*p = 10; /* i will be 10 */

这是correct,因为 p 已声明constant pointer to int,所以您可以通过 p 更改 p 指向的整数值。

int i=0;
const int const *p;
p = &i;  /*error*/
*p = 10; /*error*/

这是incorrect,因为 p 已声明constant pointer to constant int,因此您既不能通过 p 更改 p 指向的整数值,也不能更改 p 声明后的值。

于 2020-08-29T08:47:47.727 回答
0

“可以声明一个const指针,然后给它赋值……”

const int32_t *p不是const指向int32_t. 它是指向 的非const指针const int32_t

int32_t * const p;会给你一个const指向int32_t. 注意说明const符位于声明符的右侧*

您可以根据需要修改指针本身,因为它不是const,所以p = &(index);很好。请注意,括号是多余的。

“......但不可能声明一个普通变量然后为其赋值。”

const int32_t s;不是“正常的可修改”变量。它是用 声明的const。您不能const在定义/初始化后分配变量。您只能在其定义处对其进行一次初始化。

因此,使用

 const int32_t s;
 s = 10; 

当然给你一个错误。

我怎样才能摆脱这个错误?

s在其定义处初始化:

const int32_t s = 10; 
于 2020-08-29T08:16:36.463 回答