顾名思义:指针类型的数组,首先是一个数组,数组元素存储的是指针。(中国的修饰词往往都在前面,而西方修饰词往往是放在后面)

语法如下:

目标类型 数组名称[元素个数]

如:int * p[3] 数组p有3个元素,每个元素存储的都是指针类型

int a[] = {1, 3, 5}; //定义数组a

int* p[3]; //定义指针数组p,有三个元素,每个元素存储都是指针类型

p[0] = a; //或 &a[0]

p[1] = &a[1]; //或 a+1

p[2] = a + 2; //或 &a[2]

为什么 &a[0]和a是等价的呢?因为a在表达式中会转换为数组a首元素的首地址。

此时:

*p = *(p+0) = p[0] = a = &a[0] 这5个都是同数组a的首元素地址,只要用*号对它们运算,即得到数组第一个元素的值1

**p = *(*(p+0)) = *[p0] = *a = *(&a[0]) 这5个结果都是数值1


#include <stdio.h>
/*
时间:2022-04-28 15:31
作者:sgbl888
功能:指针数组
知识点:
    1、指针类型的数组,首先是数组,数组元素存储的都是指针
    2、数组名在表达式中会转换为数组首元素的首地址
    3、对数组名使用sizeof关键字或对数组名取地址 &数组名 不会转换首元素的首地址
*/
int main(){
    int a[] = {1, 3, 5};
    int *p[3]; //[]符高于其它运算符,p先与[3]组合。因此p[3]是一个有3个元素的int*(整型指针)的数组。简单点是就数组里面存储的都是指针类型
    p[0] = a; //或 a
    p[1] = a+1; //或 a+1
    p[2] = a+2; //或 a+2

    printf("p[3] sizeof: %zd Byte\n", sizeof p); //p三个元素都是int*指针,在64位系统占用8字节,三个元素共占用24个字节

    printf("%p %p %p\n", &a[0], &a[1], &a[2]); //打印三个元素的地址
    printf("%p %p %p\n", p[0], p[1], p[2]); //都是指向数组a的各个元素
    printf("%p %p %p %p %p\n", *p, *(p+0), p[0], a, &a[0]); //结果都是数组第一个元素的首地址
    printf("%d %d %d %d %d\n", **p, *(*(p+0)), *p[0], *a, *(&a[0])); //结果都是数值1

    return 0;
}

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐