指针数组和数组指针的理解(个人理解版)

指针数组和数组指针的形式

int *p[3]   	// 指针数组
int (*p)[3] 	// 数组指针

指针数组和数组指针的理解

1.指针数组 int *p[3]

首先找到变量p,
(1)先与[]结合看(因为[]优先级比*高),也就是p[3],它是一个大小为3的数组;
(2)再向前看有一个*,说明这个p数组保存的是指针,且3个元素都是指针;(指针数组因此而得名)
(3)再结合int,说明每个元素的指针指向的是int类型的整数。

指针数组,它肯定是一个数组,然后联想到这个数组保存的是什么呢,指针数组保存的肯定是指针,且数组的每一个元素都是指针;再联想到,每一个元素(指针)它指向的数是什么呢,看它指向的是什么类型,int *p[3] 指向的是int型,double *p[3] 指向的是double型。

画图示意:
在这里插入图片描述
实验验证:

  1. p是不是一个数组?
  2. p数组中保存的元素是不是都是指针?
  3. p数组中每个元素指向的是不是定义的类型(int、double)?
#include <iostream>
int main() {
    
    
    int a = 10;
    int b = 20;
    int c = 30;
    int* p[3] = {
    
     &a,&b,&c };  // 指针数组 验证p就是一个数组
	
	// 验证p数组中的每一个元素都是指针,这里保存的是a,b,c的地址
    std::cout << "p[0] = " << p[0] << std::endl;
    std::cout << "p[1] = " << p[1] << std::endl;
    std::cout << "p[2] = " << p[2] << std::endl;

    std::cout << "----------------------------" << std::endl;

	// 通过解引用,验证p数组的每个元素指向的内容
    std::cout << "*(p[0]) = " << *p[0] << std::endl;
    std::cout << "*(p[1]) = " << *(p[1]) << std::endl;
    std::cout << "*(p[2]) = " << *(p[2]) << std::endl;
    
    return 0;
}

输出结果:

p[0] = 000000DA7BB9FA34
p[1] = 000000DA7BB9FA54
p[2] = 000000DA7BB9FA74
----------------------------
*(p[0]) = 10
*(p[1]) = 20
*(p[2]) = 30

2. 数组指针 int (*pp)[3]

首先找到pp
(1)由于*pp被括号括起来了,优先级最高,所以pp是一个指针;
(2)向后看[],这个指针指向的是一个数组;所以叫数组指针
(3)结合int,表示这个指针指向的数组中保存的元素都是int类型的整数。

数组指针,顾名思义就是一个指针,我们就要想,既然是指针,那么它指向的是哪个地址,在这里指向的是一个数组(数组也可以理解成地址或者指针),确定完pp指向的是一个数组之后,就要思考这个数组中保存的是什么样的数据,是int型、double型、还是其他类型。在我看来,数组指针就是一个二级指针,因为是用一个指针pp来保存另一个指针地址(数组)

画图示意:
在这里插入图片描述
实验验证:

  1. pp是不是一个指针?
  2. pp怎样指向一个数组?
  3. pp指向的数组中保存的数据是什么类型?
#include <iostream>
int main() {
    
    
    int arr[3] = {
    
     100,200,300 };
    int(*pp)[3] = &arr;         // 数组指针 这里说明pp是一个指针

	// 数组的首个元素的地址可以表示数组的地址,也可以取引用
    std::cout << "&(arr[0]) = " << &(arr[0]) << std::endl;
    std::cout << "&arr = " << &arr << std::endl;

    std::cout << "----------------------------" << std::endl;

	// 验证pp指向数组中的元素类型,通过解引用的方式
    std::cout << "*(pp) = " << *(pp) << std::endl;  // 对二级指针解引用得到数组的地址
    std::cout << "(*(pp))[0] = " << (*(pp))[0] << std::endl;  // 注意*(pp)要有括号括起来
    std::cout << "(*(pp))[1] = " << (*(pp))[1] << std::endl;
    std::cout << "(*(pp))[2] = " << (*(pp))[2] << std::endl;
    return 0;
}

输出结果:

&(arr[0]) = 000000C85519F798
&arr = 000000C85519F798
----------------------------
*(pp) = 000000C85519F798
(*(pp))[0] = 100
(*(pp))[1] = 200
(*(pp))[2] = 300

总结

  1. 指针数组,它是一个数组,数组中保存的都是指针,指针指向的是定义的类型。
  2. 数组指针,它是一个指针,指针指向的是一个数组,数组中元素的类型也是定义的类型。
  3. 数组指针可以理解成二级指针,用指针保存指针。

猜你喜欢

转载自blog.csdn.net/qq_41821678/article/details/134434825
今日推荐