+ -
当前位置:首页 → 问答吧 → 关于数组常量和指针

关于数组常量和指针

时间:2011-12-24

来源:互联网

char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";

s1是在运行时赋值,而s2是在编译时就确定的,想问问为什么....?谢了先...

作者: bluesnail1986   发布时间: 2011-12-24

s1是一个字符串数组,"aaaaaaaa"是这个数组的初始值.所以运行到这里时,要把数组初始化,也就是运行时赋值.

s2是一个char*类型的指针,"bbbbbbb"是在常量区分配好空间的字符串,这种写法的意思是,用该字符串的首元素指针初始化s2.

作者: mingliang1212   发布时间: 2011-12-24

引用 1 楼 mingliang1212 的回复:

s1是一个字符串数组,"aaaaaaaa"是这个数组的初始值.所以运行到这里时,要把数组初始化,也就是运行时赋值.

s2是一个char*类型的指针,"bbbbbbb"是在常量区分配好空间的字符串,这种写法的意思是,用该字符串的首元素指针初始化s2.

那在编译阶段,编译器对s1做了什么呢?

作者: bluesnail1986   发布时间: 2011-12-24

引用 2 楼 bluesnail1986 的回复:
引用 1 楼 mingliang1212 的回复:

s1是一个字符串数组,"aaaaaaaa"是这个数组的初始值.所以运行到这里时,要把数组初始化,也就是运行时赋值.

s2是一个char*类型的指针,"bbbbbbb"是在常量区分配好空间的字符串,这种写法的意思是,用该字符串的首元素指针初始化s2.

那在编译阶段,编译器对s1做了什么呢?


在编译阶段只会生成代码.任何对象都是在运行时才产生的.也就是说编译器什么都不能对s1,s2做.他只能写出代码,告诉计算机执行到这里时对s1,s2做什么.
"aaaaaa","bbbbb"是在常量区的字符串,在开始进入main函数之前已经在内存中了.
然后运行到该语句时就会按我1楼说的那样初始化.

作者: mingliang1212   发布时间: 2011-12-24

引用楼主 bluesnail1986 的回复:
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";

s1是在运行时赋值,而s2是在编译时就确定的,想问问为什么....?谢了先...

这种说法不合适的,编译过程都只是在常量存储区存放字符,对s1和s2什么都没做,只是运行时候s1需要把常量存储区中的字符复制到s1说指向的内存也就是栈中,这就是我们常说的赋值,而s2只是被赋值了一个地址

作者: IT_LEAF   发布时间: 2011-12-24

对于 s1 , 在编译的时候,系统把"aaaaa"这个数据指定了一个符号叫做 s1.
所以 s1 仅仅是一个有意义的符号,她表示 "aaaaa" 这个数据,可以进行很多操作,但是不能给她赋值。
因为符号是没有自己的存放空间的。

对于 s2 , 在编译的时候,系统为她指定了一个位置,所以她又自己的存放空间,这就是变量。
这里需要区别的是 int a; 和 const int a; 的差别。
同时,在编译的时候,编译器为这个变量指定了一个初始值,这个初始值为 "bbbbb" 的缺省符号。

作者: Saleayas   发布时间: 2011-12-24

引用 3 楼 mingliang1212 的回复:

引用 2 楼 bluesnail1986 的回复:
引用 1 楼 mingliang1212 的回复:

s1是一个字符串数组,"aaaaaaaa"是这个数组的初始值.所以运行到这里时,要把数组初始化,也就是运行时赋值.

s2是一个char*类型的指针,"bbbbbbb"是在常量区分配好空间的字符串,这种写法的意思是,用该字符串的首元素指针初始化s2.

那在编译阶段,编译器对s……

常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧

作者: IT_LEAF   发布时间: 2011-12-24

引用 6 楼 it_leaf 的回复:

常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧


编译期间只生成代码.绝对不会对内存区初始化.因为程序执行之前是没有拥有任何内存的.甚至代码都不在内码中.只有当操作系统加载了代码,才有可能执行任何操作,包括全局对象的初始化.之类的.

作者: mingliang1212   发布时间: 2011-12-24