【C语言】指针数组和数组指针

前言

        指针数组和数组指针是C语言中经常混淆的两个概念,虽然他们的名字相似,但其含义却完全不同。

指针数组

        指针数组本质是一个数组,特点是数组中的元素均为指针,其定义形式为:

数据类型 *指针名[长度]

例如

int *ptr[5]; 

        这是一个包含5个元素的数组,每个元素都是指向int类型的指针 

示例代码

#include <stdio.h>

int main() {
    int a = 10;
    int b = 20;
    int c = 30;

    int *ptr[3]; // 声明一个包含3个元素的指针数组
    /*分别给数组的三个元素赋值,值分别为abc的地址*/
    ptr[0] = &a;
    ptr[1] = &b;
    ptr[2] = &c;

    for (int i = 0; i < 3; i++) {
        printf("ptr[%d]: %d", i, *ptr[i]);
    }

    return 0;
}

数组指针

        数组指针本质是一个指针,但它指向的是一个数组。其定义形式为:

数据类型 (*指针名)[长度]

例如

int (*ptr)[5];

        这是一个指向包含5个int类型元素的数组的指针 

示例代码

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int (*ptr)[5] = &arr; // 声明一个指向包含5个int类型元素的数组的指针

    for (int i = 0; i < 5; i++) {
        printf("Element %d: %d ", i, (*ptr)[i]);
    }
    printf("
");

    return 0;
}

区别总结

  • 指针数组:是一个数组,其元素都是指针。例如,int *ptr[5];表示一个包含5个元素的数组,每个元素都是指向int类型的指针。
  • 数组指针:是一个指针,它指向一个数组。例如,int (*ptr)[5];表示一个指向包含5个int类型元素的数组的指针。

         其实我们在大多数情况下,很少使用数组指针,因为数组指针的定义形式不如直接用int a[5]更为方便;但指针数组却在需要储存多个地址的时候经常被用到,例如字符串和二维数组。

 示例程序

#include <stdio.h>

int main() {
    const char *strArray[] = {"Hello", "World", "Pointer", "Array"};
    const char **ptr;

    // 将指针数组指向字符串数组的每一个元素
    for (int i = 0; i < 4; i++) {
        ptr = &strArray[i]; // ptr现在指向strArray的第i个字符串
        printf("String at strArray[%d]: %s\n", i, *ptr);
    }

    return 0;
}

 其输出结果是

Hello
World
Pointer
Array

           在这个例子中,strArray是一个包含4个字符串的数组。ptr是一个指向char类型的指针的指针(即指向字符串的指针)。通过循环,我们将ptr依次指向字符串数组的每一个元素,然后通过*ptr访问每一个字符串。

  • 指针数组在二维数组中的应用:通过指针数组可以方便地访问和操作二维数组中的元素。例如,int (*ptr)[4]可以指向二维数组的每一行,从而通过(*ptr)[j]访问具体的元素。
  • 指针数组在字符串中的应用:通过指针数组可以方便地访问和操作字符串数组中的每一个字符串。例如,const char **ptr可以指向字符串数组的每一个元素,从而通过*ptr访问具体的字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值