C++学习的时候遇到的问题

/*

 

声明如果没有声明的话三个函数不变

 

 

 

在没有char cd[]="44523";这句话

程序头为

#include<stdio.h>

#include<stdlib.h>

char ga[]="abcdefghijklm";

结果如下

addr of global array=0X402000

addr of ga[0]=0X402000

addr of ga[1]=0X402001

14

addr of array param=0x22ff20

addr of ca[0]=0x402000

addr of ca[1]=0x402001

++ca=0X402001

addr of array param=0x22ff20

addr of ca[0]=0x402000

addr of ca[1]=0x402001

++ca=0X402001

1

请按任意键继续. . .

 

在加上char cd;后

程序头变为

#include<stdio.h>

#include<stdlib.h>

char cd

char ga[]="abcdefghijklm";

 

结果

addr of global array=0X404010

addr of global array=0X402000

addr of ga[0]=0X402000

addr of ga[1]=0X402001

14

addr of array param=0x22ff20

addr of ca[0]=0x402000

addr of ca[1]=0x402001

++ca=0X402001

addr of array param=0x22ff20

addr of ca[0]=0x402000

addr of ca[1]=0x402001

++ca=0X402001

1

请按任意键继续. . .

 

在程序头为

#include<stdio.h>

#include<stdlib.h>

int cd

char ga[]="abcdefghijklm";

结果是

addr of global array=0X404010

addr of global array=0X402000

addr of ga[0]=0X402000

addr of ga[1]=0X402001

14

addr of array param=0x22ff20

addr of ca[0]=0x402000

addr of ca[1]=0x402001

++ca=0X402001

addr of array param=0x22ff20

addr of ca[0]=0x402000

addr of ca[1]=0x402001

++ca=0X402001

1

请按任意键继续. . .

 

在加上 char cd[]="44523";

程序头变为

#include<stdio.h>

#include<stdlib.h>

char cd[]="44523";

char ga[]="abcdefghijklm";

结果

addr of global array=0X402000

addr of global array=0X402006

addr of ga[0]=0X402006

addr of ga[1]=0X402007

14

addr of array param=0x22ff20

addr of ca[0]=0x402006

addr of ca[1]=0x402007

++ca=0X402007

addr of array param=0x22ff20

addr of ca[0]=0x402006

addr of ca[1]=0x402007

++ca=0X402007

1

请按任意键继续. . .

 

更改

char cd[]="44523";

char ga[]="abcdefghijklm";

两句的位置后

结果如下

addr of global array=0X40200E

addr of global array=0X402000

addr of ga[0]=0X402000

addr of ga[1]=0X402001

14

addr of array param=0x22ff20

addr of ca[0]=0x402000

addr of ca[1]=0x402001

++ca=0X402001

addr of array param=0x22ff20

addr of ca[0]=0x402000

addr of ca[1]=0x402001

++ca=0X402001

1

请按任意键继续. . .

 

基于以上可以得出

//应该说程序为变量分配内存会因数据类型不同而分在相应的区块里

//所以如果第一句为char cd;的话,不会影响到ga的值,因为ga是数组里的

//第一个量,它分配在了第一个位置上,仅此而已 (这是徐悦竹老师讲的)

同时可以看到一个char型变量是占一个内存单元cd数组有5个元素,首元素为

0X402000,则第五个为0X402005,然后紧接着ga的首元素为0X402006

那么int

程序头变为

#include<stdio.h>

#include<stdlib.h>

 int cd[]={4,4,5,2,3};

 char ga[]="abcdefghijklm";

 结果为

 addr of global array=0X402000

addr of global array=0X402014

addr of ga[0]=0X402014

addr of ga[1]=0X402015

14

addr of array param=0x22ff20

addr of ca[0]=0x402014

addr of ca[1]=0x402015

++ca=0X402015

addr of array param=0x22ff20

addr of ca[0]=0x402014

addr of ca[1]=0x402015

++ca=0X402015

1

请按任意键继续. . .

 

这是个比较不一样的地方,int型是比char型大一倍,但是13不是5的倍数(cd5int元素)

猜测:int后应该会有个收尾的工作,占了3个字节

我再次把 

int cd[]={4,4,5,2,3};

 char ga[]="abcdefghijklm";

 两句调换位置

 此时程序头为

 #include<stdio.h>

#include<stdlib.h>

char ga[]="abcdefghijklm";

int cd[]={4,4,5,2,3};

结果为

 addr of global array=0X402010

addr of global array=0X402000

addr of ga[0]=0X402000

addr of ga[1]=0X402001

14

addr of array param=0x22ff20

addr of ca[0]=0x402000

addr of ca[1]=0x402001

++ca=0X402001

addr of array param=0x22ff20

addr of ca[0]=0x402000

addr of ca[1]=0x402001

++ca=0X402001

1

请按任意键继续. . .

可以看到在cdchar型数组变量的时候,系统在为ga分配完内存后直接给cd分配内存

addr of global array=0X40200E

addr of global array=0X402000   说明在ga13个元素后直接给cd分配内存了

(cd=ga尾元素+1)

而在cdint型数组的时候,

  addr of global array=0X402010

addr of global array=0X402000

又是空出了3个字节,

那么这3个字节作为收尾代价是确定了

观察在cd为一个int型的变量和char变量时候的结果

addr of global array=0X404010

addr of global array=0X402000

此时的cd不是数组的首元,而是一个int变量,结果同样是空出3个字节,说明编译器分配内存时在不同类型(char int char[] int[]之间会有空隙

我会好奇这3个字节是什么作用,或者存了些什么

 

此时程序头为

 #include<stdio.h>

#include<stdlib.h>

 char ga[]="abcdefghijklm";

int cd[]={4,4,5,2,3};

main函数里打印cd地址的语句后加上

printf("addr of global array=%#X  /n",*(cd+1));

 

结果为

addr of global array=0X402010

addr of global array=0X4

addr of global array=0X402000

addr of ga[0]=0X402000

addr of ga[1]=0X402001

14

addr of array param=0x22ff20

addr of ca[0]=0x402000

addr of ca[1]=0x402001

++ca=0X402001

addr of array param=0x22ff20

addr of ca[0]=0x402000

addr of ca[1]=0x402001

++ca=0X402001

1

请按任意键继续. . .

可以看出,cd+1就存了个地址块的名字,这个现象我想知道下原因,这3个字节干什么用了

我的猜测是它记录大内存的位置,因为那个addr of global array=0X4,这个数字是很大的

 

同时可以看出char型变量是一个字节,如果cd[]int型的话,则cd的一个元素占4个字节,课本上记录的是int16位两个字节,所以这里就不一样了。查阅资料后在《C++ Primer》中找到:实际应用中,大多数通用机器都是使用和long类型一样长的32位来表示int类型的。

 

 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值