C语言中用const声明全局变量赋初值和不赋初值有何区别?变量存放位置有啥不一样?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中用const声明全局变量赋初值和不赋初值有何区别?变量存放位置有啥不一样?相关的知识,希望对你有一定的参考价值。

声明时不赋初值可以用指针修改其值,但是生命时赋初值,再用指针修改其值,编译通过,运行出错

参考技术A const 定义的常量 是赋初值的 不赋初值 就没法给值了 因为const 常量 放在系统常量区 那里的内存是只读的 除非强制转换为非const类型 否者无法修改其内容追问

在VC++6.0里面,const定义全局变量定义时不赋初值的话,后面用指针可以修改它的值啊,只是不能把它直接当左值使用

追答

你要明白 是定义的指向常量的普通指针 还是常指针 像数组名就是常指针 就不能当左值使用
而一个普通指针指向常量 是指针的所指向的内容不变 而 指针本身可以作为左值使用,比如指向其他常量或变量。
而指针指向的内容是不可以作为左值使用的,比如改变常量的值。
#include
const int a=5; //首先 不初始化常量 编译器会报错 必须初始化
int main()

const int *b=&a;
*b=10; // 修改常量的值 编译器会报错是非法的
printf("a=%d b=%d \n",a,*b);
return 0;

追问

你没听明白我的意思,
const int a;\\定义一个全局变量
int main()

int* p = &a;
*p = 12;
print("%d",a);//此时打印出12
*p = 10;
print("%d",a);//此时打印出10
return 0;

但是如果改为const int a = 5;
程序能从过编译,但是运行时出错,估计是指针修改了系统不想让修改的内容

追答

 

 

这样编译器会报错

除非你强制转换传 指针类型 int *p=(int *)&a;

但是*p的内容依然是常量 在常量区依然是不可修改的的 

参考技术B const 最好是赋初值,否则可能出现不可预料的后果。
你无法排除编译器直接将const变量当成常量来用,另外,全局变量有些编译器会默认赋值0.追问

我感觉const不赋初值和赋初值,他们在内存中存放的位置不一样。赋初值存放在常量区,不赋初值存放在静态变量区,跟普通的全局变量没什么区别,只不过是编译器不能作为左值使用,不知道这样理解对不对?

追答

这样理解当然不对了,因为编译器的实现并不是统一的,任何脱离了标准的臆想都无法何证所有的实现都 是这样的。
比如下面代码,
char *s = "Hello World!";
*(s+5)=0;
printf(s);
我可以告诉你,这段代码有的编译器会出错,有的会通过后输出Hello World!,有的会输出Hello
有的会运行时出错。因为这跟你说的那些都是标准中没有明确说这样写是合法或不合法的。当然,较新的标准我没看,在旧的标准是没有规定的。

默认值场景

  • 里定义的数据成员称为属性,属性可以不赋初值,若不赋初值则JAVA会为其添加默认值
  • 方法里定义的数据成员称为变量,变量在参与运算之前必须赋初值

来自 http://www.cnblogs.com/renyuan/archive/2012/11/07/2758507.html

以上是关于C语言中用const声明全局变量赋初值和不赋初值有何区别?变量存放位置有啥不一样?的主要内容,如果未能解决你的问题,请参考以下文章

在单片机编程时那些unsigned int是否可以不赋初值,都默认初值是0

在c语言中给变量赋初值有啥作用

C语言指针变量为啥要赋初值?

.为啥c语言里有的变量要赋初值,有的变量不用赋。

梓益C语言学习总结

static