C 中的常量:声明与定义分开
Constants in C: declaration separate from definition
全部C代码:
为什么允许这样做:
int main()
{
const int *i;
int j=2;
i=&j;
}
但不是这个:
int main()
{
const int i;
int j=2;
i=j;
}
有没有办法声明一个局部常量变量,然后在范围内的其他地方定义它?第一种使用指针的情况是不可靠的,因为我可以多次定义它,首先破坏了常量关键字的目的。
const int *i
表示i
指向的int
是const
,所以不能做*i = j
。但是 const int i
意味着 i
本身就是 const
所以你必须像 const int i = 2;
一样声明它然后它仍然是 const
并且不能被触摸。
区别在于你改变了什么。如果你有一个 const
整数——它不能被改变,如果你有一个指向 const
整数的指针——并且指针不是 const
,那么,那个指针可以被分配给指向任何你想要的int
。
回答你的问题:不,你不能定义一个 const int
然后重新定义它。这否定了 const
.
的含义
从语义上讲,第一个示例的意思是 "a pointer to a const int" 而不是 "a const pointer to an int"。
因此,当您将 i 设置为指向 j(非常量整数)时。 i 现在指向一个 const,因此你不能通过指针 i 改变 j 的值,例如:
int main()
{
const int *i;
int j=2;
i=&j;
*i = 4;
}
无法编译,给出错误 "assignment of read-only location ‘*i’"。因此指针限制了您对所指向的值的访问。但是指针本身还是可以改变的。
C 作为一种语言,并没有真正提供太多保护,您通常可以丢弃 const 并为变量分配一个新值,例如:
#include <stdio.h>
void assign(int *a) {
*a=5;
}
int main()
{
int const i=1;
int j=2;
assign((int *) &i);
printf("i: %d\n",i);
}
但我不确定我是否会推荐它。虽然这在某些版本的 gcc 中有效,但这种行为在 C 标准中可能未定义。
全部C代码:
为什么允许这样做:
int main()
{
const int *i;
int j=2;
i=&j;
}
但不是这个:
int main()
{
const int i;
int j=2;
i=j;
}
有没有办法声明一个局部常量变量,然后在范围内的其他地方定义它?第一种使用指针的情况是不可靠的,因为我可以多次定义它,首先破坏了常量关键字的目的。
const int *i
表示i
指向的int
是const
,所以不能做*i = j
。但是 const int i
意味着 i
本身就是 const
所以你必须像 const int i = 2;
一样声明它然后它仍然是 const
并且不能被触摸。
区别在于你改变了什么。如果你有一个 const
整数——它不能被改变,如果你有一个指向 const
整数的指针——并且指针不是 const
,那么,那个指针可以被分配给指向任何你想要的int
。
回答你的问题:不,你不能定义一个 const int
然后重新定义它。这否定了 const
.
从语义上讲,第一个示例的意思是 "a pointer to a const int" 而不是 "a const pointer to an int"。
因此,当您将 i 设置为指向 j(非常量整数)时。 i 现在指向一个 const,因此你不能通过指针 i 改变 j 的值,例如:
int main()
{
const int *i;
int j=2;
i=&j;
*i = 4;
}
无法编译,给出错误 "assignment of read-only location ‘*i’"。因此指针限制了您对所指向的值的访问。但是指针本身还是可以改变的。
C 作为一种语言,并没有真正提供太多保护,您通常可以丢弃 const 并为变量分配一个新值,例如:
#include <stdio.h>
void assign(int *a) {
*a=5;
}
int main()
{
int const i=1;
int j=2;
assign((int *) &i);
printf("i: %d\n",i);
}
但我不确定我是否会推荐它。虽然这在某些版本的 gcc 中有效,但这种行为在 C 标准中可能未定义。