指针数组 | 数组指针

  • 指针数组(array of pointers):

    一个数组,若其元素均为指针类型数据,称为指针数组。 也就是说,指针数组中每一个元素都相当于一个指针变量。其详细形式应该如下: *a[0], ...*a[n]. 每一个数组里面存储的是其指向的地址;一维指针数组的定义形式为:类型名 *数组名[数组长度]
例如:int *p[4],由于[]比*优先级更高,因此p先与[4]结合,形成p[4]的形式,这显然是数组形式。然后再与p前面的*结合,*表示此数组是指针类型的,每个数组元素都指向一个整型变量。本语句表示的含义就是说:p是一个指向二维数组的首指针,并且这个二维数组低维的维数为4。因此,编译器只是为p分配了一个指针的空间,在32位系统中,一般是4个字节。由于它不是一个数组,因此,编译器也不会为之分配数组空间。

  • 数组指针(a pointer to an array):

  一:数组指针:数组名本身就是一个指针,指向数组的首地址。注意这是声明定长数组时,其数组名指向的数组首地址是常量。而声明数组并使某个指针指向其值指向某个数组的地址(不一定是首地址),指针取值可以改变。
  二:数组指针:是指向数组的一个指针,如int (*p)[10] 表示一个指向10个int元素的数组的一个指针。

 

指针数组如下处理就会很清楚:
    typedef int* intPtr;
    intPtr p[2];

同理,数组指针也可以作类似处理:
    typedef int intArray2[2];
    intArray2 * p;

例:

#include <iostream>

using namespace std;

int main()
{
    int ar[4] = {1,2,3,4};
    int *ptr1[4];   //指针数组
    int (*ptr2)[4];   //数组指针
    int i;
    ptr2 = &ar;       //将ar的首地址给ptr2
    for(i = 0; i < 4; ++i)  //将ar中的元素给prt1
        ptr1[i] = &ar[i];
    for(i = 0; i < 4; ++i)
        cout << *ptr1[i] << " ";
    cout << endl;
    for(i = 0; i < 4; ++i)
        cout << (*ptr2)[i] << " ";
    cout << endl;
    return 0;
}

注意:定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址,容易犯的错得就是,不给ptr2地址,直接用(*ptr2)[i]=ar[i]给数组ptr2中元素赋值,这时数组 指针不知道指向哪里,调试时可能没错,但运行时肯定出现问题,使用指针时要注意这个问题。但为什么ptr1就不用给他地址呢,ptr1的元素是指针,实际上for循环 内已经给数组ptr1中元素指定地址了。但若在for循环内写*ptr1[i]=ar[i],这同样会出问题总之一句话,定义了指针一定要知道指针指向哪里,不然要悲剧。

posted @ 2013-11-15 11:39  Hewie_Bai  阅读(279)  评论(0编辑  收藏  举报