zoukankan      html  css  js  c++  java
  • 指针数组和数组指针的区别

    这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。

    指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针

    数组指针:a pointer to an array,即指向数组的指针

    还要注意的是他们用法的区别,下面举例说明。

    int* a[4]     指针数组(四个指针)     

                     表示:数组a中的元素都为int型指针    

                     元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

    int (*a)[4]   数组指针(一个指针,即指向一个一维数组(x[4])的指针,a=&x)     

                     表示:指向数组的指针a

                     元素表示:(*a)[i]  

    注意:在实际应用中,对于指针数组,我们经常这样使用:

    1 typedef int* pInt;
    2 pInt a[4];

    这跟上面指针数组定义所表达的意思是一样的,只不过采取了类型变换。

    代码演示如下:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     int c[4] = {1,2,3,4};
     7     int *a[4];//指针数组
     8     int (*b)[4];//数组指针
     9     b = &c;
    10     //将数组c中元素赋给数组a
    11     for(int i = 0; i < 4; i++)
    12     {
    13         a[i] = &c[i];
    14     }
    15     //输出看下结果
    16     cout << *a[1] << endl; //输出2就对
    17     cout << (*b)[2] << endl; //输出3就对
    18     return 0;
    19 }
     

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

    类似的还有指针函数和函数指针,遇到了再说吧。

  • 相关阅读:
    HDU 5744
    HDU 5815
    POJ 1269
    HDU 5742
    HDU 4609
    fzu 1150 Farmer Bill's Problem
    fzu 1002 HangOver
    fzu 1001 Duplicate Pair
    fzu 1150 Farmer Bill's Problem
    fzu 1182 Argus 优先队列
  • 原文地址:https://www.cnblogs.com/zenseven/p/4176776.html
Copyright © 2011-2022 走看看