指针数组和数组指针

165 阅读1分钟

1、指针数组

由名字就可以知道,指针数组就是指针的数组,表示有一个数组存放多个指针,那么怎样定义一个指针数组呢?
int array[3] 表示多个整数,叫整型数数组,
int* parray[3] 表示多个指针,叫做指针数组,数组中的每一项元素都是指针变量,指针变量就是存放地址的变量。
示例代码如下

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int a = 1;
    int b = 2;
    int c = 3;
    int i;
    int *parray[3];
    parray[0] = &a;
    parray[1] = &b;
    parray[2] = &c;

    for(i = 0;i < 3;i++){

        printf("%d\n",*(parray[i]));
        parray[i]++;
    }

    system("pause");
    return 0;
}

代码中定义了三个整型变量a , b , c并赋予初值,然后定义了一个int型的指针数组(int *parray[3]),因为指针变量是存放地址的变量,所以数组中分别存放的是a , b , c 的地址,下面遍历数组的时候直接取数组中的每一项的内容就可以输出a , b , c 了,但是要注意指针要向后偏移。
变量a , b , c 在内存中的位置是系统随机分配的,三个毫无关系的整型变量,通过指针数组让三个数连在一起了,

二、数组指针

数组指针就是数组的指针,存放整个数组的指针,表示只有一个指针
定义一个数组指针
int (*p)[3]就定义了一个数组指针,数组的指针,强调的是类型,数组的个数,
示例代码

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int array[3] = {1,2,3};
    int (*p)[3];    //数组指针
    p = array;
  //遍历数组指针
  /*  for(i = 0;i < 3;i++){

        printf("%d\n",(*p)[i]);

    }     */

	p = array;//让指针重新指向数组名
    int *p2;   //普通指针
    p2 = array;  //指向数组名

    printf("数组指针p的地址 = %p\n",p);
    printf("p2地址 = %p\n",p2);

    printf("=========================\n");

    printf("p2地址++ = %p\n",++p2);

    printf("数组指针p的地址++ = %p\n",++p);
    
    system("pause");
    return 0;
}

在这里插入图片描述
可以看到这里数组指针和普通指针的用法几乎一样,都是指向数组第一个元素的地址,=号上面打印的是数组第一个元素的地址,因为p 和 p2都是存放的数组第一个元素的地址,所以地址应该一样,=号 下面打印的是 p 和 p2 偏移后的地址,因为数组为int 型的,所以 p2 的偏移是4个字节,但是数组指针 p 的偏移值为 12 ,偏移了整个数组(3 x 4)。