数组不仅那点东西

来源:互联网 发布:上海炫踪网络 编辑:程序博客网 时间: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。
感慨:小东西,大文章。浑厚才是王道!
原创粉丝点击