如何遍历指针数组?

其实很多时候,对基础重视还是远远不够,比如如何指针数组,一维,二维,三维,维度一多,就可以犯晕,说到底还是对自己掌握对不够牢固.

下面是我们遍历对一维对数组.

int a[5] = {1,2,3,4,5};
    int *p = a; //可以遍历一维数组
    p++;
    cout << p << endl;
    cout << &a[1] <

重点在哪里,重点在于p++,这个编译器是怎么理解的,放后面我们说.

OK,一维的容易啊,接下来我们看指针数组.

	int *a1 [3];
    a1[0] = new int [3] {1,2,3};
    a1[1] = new int [4] {4,5,6,7};
    a1[2] = new int [2] {8,9};

接下来我们怎么来遍历这个指针数组呢?

其实这里我们是有一个盲区的,这个盲区就是我们不知道二维数组在内存中的排布规则.

上面留下了2个问题,接下来我们来分析,回归到最最基础的问题:

首先老生常谈的问题,指针是什么?

在理解这个问题的时候,我们需要理解的概念是指针的值和地址.

如何遍历指针数组?_第1张图片
首先数组肯定是一块连续的内存,

所以指针数组的形式肯定是类似的形式:

如何遍历指针数组?_第2张图片
OK这个掰清楚了,剩下的就很容易理解清楚了.

p++ ,指针++实际上是什么?
p在内存的位置是肯定没有办法发生改变的,所以我们其实用屁股想都可以知道,p++改变的肯定是它的值,也就是它指向的内存的地址.

int*p ;
p++;

p++改变了自己的值,但是改变的长度是多少呢?长度由自己指向的类型来决定,比如这里p指向了int类型,所以长度就是sizeof(int).

如何遍历指针数组?_第3张图片
类似这样,地址肯定不变,值发生改变.

所以我们如何遍历指针数组呢?

我们必须创建一个指针,让这个指针的值等于这个指针数组的首地址就可以了.

int * a1[5];
int ** a2 = &a1;

a2++ ,a2-- 类似这样的方式,我们便可以遍历指针数组了,是不是很简单.

你可能感兴趣的:(c/c++/c++,11)