• 指针数组 | 数组指针


    • 指针数组(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],这同样会出问题总之一句话,定义了指针一定要知道指针指向哪里,不然要悲剧。

  • 相关阅读:
    如何修改 gitlab 的项目名称
    Vue 项目中 webSocket 的使用(服务端是 Java Spring boot)
    如何能选到好的车牌号
    实现微信,浏览器,App中H5的路线规划
    H5 navigator.geolocation demo
    npm package.json 中版本指定符号: ~ 、^、*
    小程序中静态资源绝对路径的写法
    重置gvim8 ctrl+f的翻页功能
    [TS]Map的基本操作
    [TS]闭包测试
  • 原文地址:https://www.cnblogs.com/Hewie/p/3425017.html
Copyright © 2020-2023  润新知