博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《转》对数组的一些理解
阅读量:6706 次
发布时间:2019-06-25

本文共 1950 字,大约阅读时间需要 6 分钟。

http://blog.csdn.net/seanyxie/article/details/5967546int a[5]={
1,2,3,4,5};int b[100];一个数组名代表的是数组中第一个元素的位置,通过数组名我们可以访问数组,先看下面两个问题问题一:看到一篇文章这么写的。。int array[10]; int (*ptr)[10]; ptr=&array;//这里说明&array是指向数组的指针,但为什么&array是指向数组的指针? 答一:对数组名取地址在C标准里面是未定义的行为。由于数组名是右值,而&操作符要求操作数具有具体的内存空间,换言之就是一个变量,因此对数组名取地址本来就是非法的,早期的编译器明确规定这是非法的。不过不知道什么原因,现在的编译器多数把&array定义为一个值跟array相同,类型是一个指向数组的地址,注意了,是地址,不是指针。之所以是指向数组的地址,是因为array是一个数组名,它就代表了int array[10]这个数组。而ptr也是定义为一个指向具有10个int数的数组的指针,因此&array能被赋予ptr。 问题二:对于数组b[],b是数组的地址,但b不算变量,有没有一个地方存放b?而且b是不是存放的就是自己所在的地址。因为我碰到了如下的问题:定义一个指针数组char *a[2];那么a的值和&a的值是不是应该一样?答二:数组名是符号地址常量,在编译时求值并存在编译器的符号表里面,其值就是个内存地址;所以你说的有没有一个地方存放b,可以认为程序没有给其分配空间,数组名只是代表了那个数组空间;与指针不一样,指针指向一块空间,同时指针本身也存储在某个空间;可以认为数组名存在在符号表里,符号表是编译器用的,我们管不到;a和&a值是一样的,本来对常量取地址是非法的,但是标准组织没有定对数组名取地址是非法还是合法,所以因编译器而异,VC是合法的。然后我们来看一段测试Demo#include
int main() { int a[5]={
1,2,3,4,5}; int b[100]; int *ptr=&a+1; printf("%d,%d/n",*(a+1),*(ptr-1)); printf("sizeof(b)=%d/n",sizeof(b)); printf("sizeof(&b)=%d/n",sizeof(&b)); } 结果如下为什么ptr-1的大小是5呢?是否你也像我一样认为是2,1呢?对指针进行加1操作,得到的是下一个元素的地址,一个类型为T的指针移动,以sizeof(T)为移动单位,如果ptr=a+1,那么最终输出*(ptr-1)肯定是2,1但是ptr=&a+1,为什么就是2,5呢?虽然前面我们讲对数组取地址不合法,但是我们这样做在编译器看来确实获得了数组a的首地址,&a是一个指向 int[5] 的指针。但是这时候ptr相当于int *[5],也就是指向了一个含有五个元素的数组,这也就不难解释为什么第二个打印出来&b的大小也是400了,sizeof(b)打印出来的是b数组的大小。sizeof(&b)同样也是。为此我们将他们的地址打印出来查看#include
int main() { int a[5]={
1,2,3,4,5}; int b[100]; int *ptr=&a+1; printf("%d,%d/n",*(a+1),*(ptr-1)); printf("sizeof(b)=%d/n",sizeof(b)); printf("sizeof(&b)=%d/n",sizeof(&b)); printf("a的地址%d/n",a); printf("&a的地址%d/n",&a); printf("&a+1的地址%d/n",&a+1); printf("ptr-1的地址%d/n",ptr-1); } 不难看出,&a+1的地址是&a地址再加5*sizeof(int);它的运算单位是int (*)[5]最后ptr-1,ptr-1的单位是ptr的类型,因此ptr-1的位置刚好是a[4],他在内存中的分布位置是和&a+1相邻的

 

转载于:https://www.cnblogs.com/LzKlyhPorter/p/5137012.html

你可能感兴趣的文章
羊车门作业
查看>>
浅谈思考问题的方法
查看>>
001/Node.js(Mooc)--基础知识
查看>>
event 事件绑定 attachEvent addEventListener封装
查看>>
MetaMask/zero-client
查看>>
1.HTML,CSS知识点
查看>>
环序列
查看>>
Python报错UnicodeDecodeError: ascii codec can t decode byte 0xe0 ...解决方法
查看>>
关于Hanoi算法
查看>>
完美支持中文编程的 Emacs 配置文件 .emacs
查看>>
HTTrack - 克隆任意网站
查看>>
【NOI2016】优秀的拆分(95分)
查看>>
SL本地写日志
查看>>
node.js模拟抄表 tcp服务端和客户端
查看>>
feof()的实现
查看>>
浅析I/O模型及其设计模式
查看>>
JNDI数据源的配置及使用
查看>>
jQuery的deferred对象详解
查看>>
redis 学习笔记一
查看>>
批处理最完整人性化教程
查看>>