我认为静态指针与其他静态变量一样,初始化为一个值,它具有相同的值直到结束,就像在静态指针中保存相同的地址一样。但在这种情况下,编译器会抛出错误
//initialiser element is not constant static int *a = &b[0];
#include <stdio.h>
int main(void)
{
int b[2];
static int *a = &b[0]; // removing static the program works well.
printf("%u",a);
a = &b[1];
printf("%u",a);
return 0;
}
那么静态指针的用途是什么?
答案 0 :(得分:4)
在C中,您的代码没有意义。 b
具有自动存储持续时间,因此每次遇到main
时,概念上都会有不同的地址。 static
只会被初始化一次,而在main
的后续调用中,它可能会指向无效的内容。
但是,这是有趣的一点,在C ++中它应该才有意义,因为你不允许自己调用main
:你这样做是 undefined 。所以推断这一点是编译器应该知道static
在main
的生命周期内有效,并编译代码!也许C ++标准中有些内容明确禁止这一点。
在C中,您可以递归调用main
(甚至是隐式递归),因此编译器应该发出错误。
答案 1 :(得分:3)
您有两种选择。将静态添加到int b[2]
,或将其从int *a
中删除。
b
的地址不是静态的。它是可变的,因为b
是一个具有自动存储的变量。
答案 2 :(得分:0)
static
vs const
可能存在混淆。
Const变量在初始化之前将保持相同的值,直到它们超出范围,除非使用const_cast<>
,尽管@Bathsheba在评论中提到,在变量上使用const_cast<>
声明的const是未定义的。
静态意味着它将在第一次到达时初始化,但在程序执行结束之前不会超出范围。