数组不仅那点东西
来源:互联网 发布:上海炫踪网络 编辑:程序博客网 时间:2024/06/11 19:35
学过C语言的人都知道,数组就是一个相同数据类型的集合(或者说容器),用起来很方便。如,定义一个数组int price[3] = {10, 20, 15}; 要取某个数时,便直接可以通过下标操作:price[1] = 20。然而,这里我想从更深入一点的角度说明,数组不仅这点东西。
1. 数组的内存分配
程序设计中,内存被分成5个区域:栈区,堆区,全局区(静态存储区),文字常量区,程序代码区。一般定义的普通数组是被放在栈区的。由于数组又是一个具有相同类型的数据的组合,因此,存储数组的这个栈区就得开辟若干块空间存储它们,每一块空间存储一个数据,而且,这些存储着数据的空间是连续的(就像一层高楼一样)。
2. 和指针搭上关系
指针,是学C语言的门槛,越过它C语言基本上可以说懂了,指针的相关知识请参考其他书。
老师没教过我们更深入的东西,指针和数组有什么关系呢?其实数组名字本身就是一个指针。比如,int a[10];
这里的a就是一个指针,被编译后,数组名a与int * const a等价的。从这里看,由于指针被const修饰,因此你不能试图修改数组名的值。如此,掌握指针的人就知道,下面这个例子可以很好理解了:
int a[10] = {0};
int b[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
a = b; // 出错!
int *pA = a; // 正确
b = PA; // 出错!
既然数组名是一个指针,那么它的值是多少呢?数组名的值是数组第一个元素的内存单元首地址。比如,上面的数组b[10],b的值和b[0]的地址值是相等的,即b == &b[0]。
3. a与&a的区别
假如定义了这么一个数组,int a[2] = {2, 100}; 但发现 a那么a与&a是什么意思呢?
上面说了,a就是一个指针,a == &a[0],存储的是首元素的地址,即首元素的指针。&a表示是数组的指针 ,也等于&a[0]。二者可以用这么一个比喻作区别,&a就相当于首都,a就好比北京首府,它们的地址都是一样的(都在北京)。有这么一道题很能说明二者的关系和不同的:
int a[5] = {1, 2, 3, 4, 5};
int *p1 = a+1; // p1指向a[1]的地址
int *p2 = (int *)(&a+1); // p2指向下一个数组的首地址了
cout << *(p1-1) << endl; // 输出a[0],即1。
cout << *(p2-1) << endl; // 下一个数组的首地址再减1,即输出a[4] = 5。
感慨:小东西,大文章。浑厚才是王道!
- 数组不仅那点东西
- rpc那点东西
- 不仅仅是试题,可以学点东西
- 数组那点事
- 数组元素那点事
- 数组越界那点事儿
- java中关于数组那点事
- 数组(Array)那点事
- sizeof与数组之间那点事
- 关于数组的那点事
- 记录一些东西 但不仅限于代码
- 关于C#中数组的那点事!
- 指针与多维数组的那点事儿
- 腾讯实习面试题 数组那点事
- 3.要学习的东西不仅仅是技术本身
- 抓住那闪亮的东西!
- Spring头那一堆东西
- 作bs的为了以后吃饭 必须要学点精深的东西。学什么那。郁闷
- LINQ to Entities 不识别方法
- Error initializing endpoint java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bin
- Android 中的WiFi学习笔记(转载)----WIFI启动 代码流程走读---网络连接流程
- 缓冲区方式读
- Sicily 1039 Phone Home (DFS染色)
- 数组不仅那点东西
- oracle-----procedure练习
- Jquery 添加删除行[测试通过]
- UVa 437. The Tower of Babylon
- POJ-1700(过河问题-经典智力题)
- 从“正规军”与“野路子”
- oracle---练习创建序列
- android工程导入ADT缺default.properites、JDK版本和Unknown command crunch等问题小结
- charCodeAt的练习