C语言中的数组名
2015-08-11 22:28
701 查看
这里我们先看看数组名代表的是什么,这个概念可能大家有所误解,认为数组名代表的就是数组的地址,当然,数组名代表的是一个地址,但是关键是,通过这个地址,我们关注的是它能取得多大空间的数据的值,例如对于一个char 类型的地址,我们能够取得一个字节的值,对于一个int型的地址,我们能够取得4个字节的值。
这里我们以整形数组为讲解:int a[4];
a是一个地址,我们知道a其实本来的面目应该是:a+0,只不过这个0我们就省了,*(a+0)是什么呢,这个代表的就是取得第一个元素的内容,也就是a[0],所以我们可以知道a它代表的应该是第一个(下标为0)元素的地址。
这里我们先从另外一个方面来理解什么是数组,其实我们可以把数组假设为一个基本类型变量,它的类型为 int [4].也就是变量a这个对象代表的就是4个int那么大小的一个区间,而且不可分割。它和一般变量不同的地方在于,它的操作受限,不能像一般变量那样,直接通过赋值符号一次性将整个区间的值赋值给另外一个相同的数组变量。而只能通过下标来一个个元素的赋值。
通过上面的分析,&a就好理解了,他就是变量a的地址,这个变量a的作用范围是四个int空间的数据,也就是如果将&a赋给某个变量p,p的类型应该是:int (*)[4];也就是指向包含4个int数据的数组的指针。
再来看看a+1和&a+1的区别,a+1表示的是数组第一个元素地址,&a+1表示的是跨过a数组的下一个地址。通过图来表示可能更加清晰可理解:
![](http://hi.csdn.net/attachment/201105/16/0_13055200743mWR.gif)
其实&a和a的值倒是完全一样的,都是下标为0的元素的地址,关键在于它们的作用域不同,在网上看到一个比喻觉得挺恰当的,长沙在长沙市来说是中心,同时在湖南省来说,也是湖南省的政治中心,长沙即作为市的中心,也作为省的中心,但是在不同的范围内,表达的意思是不一样的。
来源:http://blog.csdn.net/wanwenweifly4/article/details/6424058
这里我们以整形数组为讲解:int a[4];
a是一个地址,我们知道a其实本来的面目应该是:a+0,只不过这个0我们就省了,*(a+0)是什么呢,这个代表的就是取得第一个元素的内容,也就是a[0],所以我们可以知道a它代表的应该是第一个(下标为0)元素的地址。
这里我们先从另外一个方面来理解什么是数组,其实我们可以把数组假设为一个基本类型变量,它的类型为 int [4].也就是变量a这个对象代表的就是4个int那么大小的一个区间,而且不可分割。它和一般变量不同的地方在于,它的操作受限,不能像一般变量那样,直接通过赋值符号一次性将整个区间的值赋值给另外一个相同的数组变量。而只能通过下标来一个个元素的赋值。
通过上面的分析,&a就好理解了,他就是变量a的地址,这个变量a的作用范围是四个int空间的数据,也就是如果将&a赋给某个变量p,p的类型应该是:int (*)[4];也就是指向包含4个int数据的数组的指针。
再来看看a+1和&a+1的区别,a+1表示的是数组第一个元素地址,&a+1表示的是跨过a数组的下一个地址。通过图来表示可能更加清晰可理解:
![](http://hi.csdn.net/attachment/201105/16/0_13055200743mWR.gif)
其实&a和a的值倒是完全一样的,都是下标为0的元素的地址,关键在于它们的作用域不同,在网上看到一个比喻觉得挺恰当的,长沙在长沙市来说是中心,同时在湖南省来说,也是湖南省的政治中心,长沙即作为市的中心,也作为省的中心,但是在不同的范围内,表达的意思是不一样的。
来源:http://blog.csdn.net/wanwenweifly4/article/details/6424058
相关文章推荐
- 多重虚继承的内存模型分析
- 【C语言】指针增减
- 生产者消费者问题 伪代码和C语言多线程实现
- C++ 编译过程
- C++之运算符重载
- c++获取网卡MAC地址
- C++ 文件结束符
- 【C语言】32位,64位机器sizeof区别
- 关于C语言中的字符指针和字符数组
- C语言第二天
- 我的核弹C++(二)i++与++i
- C++的重载,覆盖,隐藏
- C语言基础01
- C++成长之路
- Python学习笔记2——与C++和JAVA的区别
- C语言如何接收通过键盘输入的任意长度字符串
- 浅谈C++中类的const成员变量,static成员变量和const static成员变量的区别
- C语言将一个字节逆序
- C++中的switch语句的break问题
- 关于C语言中的字符数组和字符指针