【无标题】二维数组名到底有存储单元吗?(Classyyy问题的回复)

二维数组名到底有存储单元吗?-编程语言-CSDN问答

  1. 二维数组名不是一个指针变量,也就是说二维数组名本身没有存储单元,二维数组名含义只是一个地址,或者说只是一个注释,标识符而已,二维数组名并非变量,比如 :
    char f[][11] = { {"abcd"},{"Great Wall"} }; f 没有存储单元,所以f的本身存储地址是没有的,不能用&f算出。是这样理解的吗?
  • 解释:数组名是符号常量,代表数组首地址,自身无存储单元,也就是说不存在一个有意义的地址来保存这个常量,或者说在内存中你无法找到存储这个常量自身的地址,因此这个值是不能修改的,这个f依附数组而存在,代表数组本身
  • 在你定义的这个数组是2*11个字符型元素,因此整个f占用22个字节,因为C语言不提供越界检查,因此可能出现数组越界问题,并且程序不会给出提示,
  • 这个 例子就是数组越界的典型体现,原因是本来f[0][5]的值是字符串结束标志,我把他替换之后,字符串没有找到结束标志就是继续输出,直到遇见‘\0’

2.有内存地址就有存储单元,有存储单元就有内存地址,这样理解吗?还是说前半句是不对的,一个存储单元对应一个内存地址对吗?有内存地址就不代表有存储单元了吗?

举个例子,开发商把房子卖给我们以后,我们会有几号楼几单元几零几这样的地址标记,我们可以住进去,这个楼号单元号房间号就是存储单元地址,我们的房子本身就是存储单元,地址用于别人能够找到,房子本身是用来住人,也就是cpu先通过存储单元地址来找到地方,然后才是对其值得操作,存储单元地址是不可改变的,硬件一旦组装完毕,这个地址就存在,且不会发生变化,可以变化的是当中所存的内容,房子建好之后,地址就不会发生变化,可以变化的是拥有房子的人(买房买房),还有房子里面的人(自住、出租、来朋友)

3.char s[] ="Great Wall" ;

  1. printf("s[0]地址为%x\n", &s[0]);

  2. printf("s[1]地址为%x\n", &s[1]);

运行的结果为:
s[0]地址为0x33fa3c
s[1]地址为0x33fa3d
那么意思就是,s[0]就是G字符,那就是说G放在了内存地址为0x33fa3c的存储单元里。s[1]就是r字符,r放在了内存地址为0x33fa3d的存储单元里,是这样理解对吗?

理解正确,但是要知道其实内存里面存的只有01,只是因为它是char类型的所以我们把其中的01解释为字符,这就是为什么用%c输出是字符,用%d输出是数字

4.常量会有存储单元吗?我在网上找了一些资料,似乎常量不会被分配到存储单元,那以下关于"Great Wall"为字符串常量的例子

  1. char *f = "Great Wall";

  2. printf("f值为%x\n", f);

  3. printf("&f值为%x\n", &f);

  4. printf("f+1值%x\n", f+1);

运行结果是:
f值为0x367cb4
&f值为0x55fd40
f+1值为0x367cb5
那么意思就是,f是个指针变量,系统给f分配了存储单元,该存储单元的内存地址为&f,即0x55fd40
f的值为0x367cb4,指向G,即首字符G的放在了内存地址为0x367cb4的存储单元里
f+1的值为0x367cb5,指向r,即r放在了内存地址为0x367cb5的存储单元里
那么这个时候,意味着,字符常量Great Wall,每一个字符都有存储单元,都有内存地址与之对应
,是这样的吗?那这样的话,为什么还有人说常量不会被分配存储单元呢?

你所说的蓝色部分是正确的,常量其实分为符号常量和值常量比如你要计算s=1+1,“=”、“+”都不分配内存单元,为什么?因为他们是符号常量,或者叫运算符,这些东西只在你编写程序的时候出现,编译之后,这些东西都会转化为机器指令,并没有地址去存储这些东西,数组名应该是和它相类似。至于里面的数字1会不会分配地址需要看具体编译软件不同指令集,不同操作系统会有差异,但一般来讲至少会有一个1有存储单元,到底有没有需要编译之后对EXE文件进行反汇编

5.你说到的这句话“char *f="Great Wall";后面双引号内的字符是程序可以使用的,它是一个字符型数组,我们没有给出数组名,所以无法使用数组名来访问”,我的疑问是,它是一个字符常量,应该不是字符型数组。因为字符型数组是数组,放在内存可以更改的区域,而char *f="Great Wall"的Great Wall是字符常量,不能被修改的,也就是不能运行f[0] = 'a'去修改。另外,您说的“不知道那个数组名“,但我觉得f[0]也可以表示G,f[1]也可以表示r呀,能不能说数组名就是f,谢谢。

为什么说是字符数组存储,因为c语言只有字符类型,没有字符串类型,存储字符串常量必须用字符数组,但是常量就是不能修改值得量,但是可以和字符数组一个单个输出

这个例子就是实现了单个字符输出

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值