首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于数据存储的不解(变量,常量)100分求讲解。

2013-11-20 
关于数据存储的疑惑(变量,常量)100分求讲解。。。。小白~求大神帮忙解释下,关于数据存储的相关情况。有疑惑的是

关于数据存储的疑惑(变量,常量)100分求讲解。。。。
小白~求大神帮忙解释下,关于数据存储的相关情况。
有疑惑的是只有字符串常量存储在常量区(所谓的文字区?)
【1】那么对于int a=3;之类的(整型,实型和字符型)他们是在栈上开辟空间,那么对于其中的常量3是如何存储的? 怎样理解,是3本来存储在常量区? 那样的话,不就不能通过a来改变常量的值了么? 显然不正确,所以说3到底存放在哪里? 如何实现a中存储3这个常量的?
【2】对于数组怎样理解? 比如int a[3]={1,2,3} 其中{1,2,3}这部分理解为常量么? 显然也不是这样理解的,那么该如何理解?
【3】还有就是是不是直接利用指针只能指向字符串常量,不可以指向别的常量?
【4】是不是可以理解变量的话,就是开辟一个区域。区域是固定的,所以不可以进行地址变化(比如int a=3其中进行++&a操作就会错误,但是其中的元素a是可以变的)  然后对于指针变量,它的二级指针,也就是它的地址不可变(int *p 对比上述就是意味着&*P 不可以变。但是p可以变。)
小白表示很多疑惑,求大神讲解,希望详细点。分数多多的。。嘿嘿。谢谢~~ 指针 变量 常量 c语言 存储区
[解决办法]
3是立即数,而不是放在只读数据段的。在定义时,会产生一个立即数将该立即数放到变量a中。
[解决办法]
*p 是用来存放地址的,当然  你可以放其他的值,这个值当成地址处理, 编译器编译时可能会警告。但如果把这个值当成地址, 访问这个地址存放的内容的时候, 就可能出错 
[解决办法]

变量名代表一个确定的地址和其中的数据,虽然自动变量是在函数调用时,确定地址的;

但是在每次调用时地址是固定的。
相当于常量。
而 &a 不是可修改的数据,所以 ++ &a 是不允许的。


至于 int a =10 ;这种内置类型的自动变量,可以直接当作指令的操作数,
编译后10 就嵌入到代码中了(10 成了指令中的立即数),所以就不会存储10这个常量了。

而数组初始化,直接把操作数嵌入指令中,代码太长,而且方法也不统一;
所以直接存储到数据区或者常量区。

在函数调用后复制过来,实现初始化,既方便,方法也统一,代码量也比较少,显然是更好的安排。

 
[解决办法]
1、int a=3中,a变量分配在栈上,然后把3存储在这块区域内。就好比,我在内存上租了一个房间(分配了一块内存空间给a),然后让张三住到了这个房间中(张三就是你要存储的值3),如果你要修改里面的值,就等于把张三赶出来,然后让其他人进去。
如果是单纯的3,则是一个立即数,是存在寄存器中的。赋值的操作其实就是先在寄存器上生成这个数,然后再把这个数写入到指定的空间内。你可以去看下汇编了解下。

2、这是声明一个数组,然后把这些常量丢到一个指定的空间内,理解同上。

3、C/C++的常量只的是字面值常量,其中只有字符串比较特殊,其他的常量都是立即数,他们属于右值,不存在所谓的地址。(立即数的地址即寄存器地址,寄存器地址再CPU中,而不是在内存上,具体的可以看汇编中的几种寻址方式。)
在C/C++中,只有左值可以取地址,右值是不可以取地址的,当然右值不一定是指常量,临时变量等等也属于右值。

4、++&a不一样&a是一个右值,不能对右值进行操作。至于普通的变量的地址,也可以++但++后的地址不保证可以正常使用,要么是段错误,要么就是访问了其他地址。
[解决办法]
3) 是这样的,因为,到目前为止 {。。。。} 的类型是不确定的,可能是结构,数组等
所以,不能看作某一类型的数组常量。

而字符串的类型,是确定的,字符串是带结束符的字符数组。
所以和字符指针,类型是兼容的,而且也比较方便,所以可以这样做。

C是强类型和弱类型并存的语言,所以可以用常量字符串(字符串字面值)初始化字符指针,
也可以用常量字符串(字符串字面值)给字符指针赋值。

C++,由于强类型,把这看成对C的让步;
早期是可以的。

现在C++,
认为只有常量字符指针,才可以常量字符串(字符串字面值)初始化,赋值。

变量的地址,是不可以改变的,因为改变后的地址和这个变量无关。

变量是地址和值的统一体。

没有初始化,也没有赋值的变量,它的值是未指定的。
他的地址不变,才能访问。
随便改变的话,就难以访问了。

指针变量,也是一个变量,所以它的值可以改变。
他自己的地址也是不能改变的。

变量就是一个名字,和一个地址(一块内存),建立的一种映射关系,
一个变量名字,对应一块内存区域,这块内存的位置,就是它的地址。

变量的值,就是这块内存中的数据。

数组是一批变量,所以数组名,会表示他的首元素的地址。
数组名不代表它的值,因为它是一批数据。

C 语言中数组,没有一个单一的值。
他有一批值,他的每个元素有一个值。

C++继承了C的这种表示方法,所以不能整体赋值。
只能整体初始化。











[解决办法]

引用:
char a[10]="abcd";对于这种情况,此时是不是不能把字符串和char *p=“abcd”中的等价,因为此时可以对字符串内容进行修改。是不是此时就理解成把n个数组元素分别作为立即数存在是存在寄存器中的。

这个属于第二点,就是先生成指定的空间,然后再把值丢进这些空间里。这些空间都是在栈上的。
后者的话,就不一样了,这个是先生成指定的字符串,然后再取出地址给指针p。而这些字符串是在分配在文字常量区的,而不是在栈上的,所以无法修改。

还有就是多次生成的字符串常量是不能保证一定是一个地址的。
比如if("abc"=="abc")这两者会比较地址,而不是比较两者的内容,这要依靠编译器的实现了,如果编译器允许的话,会直接取文字常量区已有的地址,如果不行的话会重新生成一个"abc",所以会有可能不相等。

热点排行
Bad Request.