当前位置: 首页 > article >正文

【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访问具体的字符串。


http://www.kler.cn/a/442025.html

相关文章:

  • 蓝桥杯备考:堆和priority queue(优先级队列)
  • C++/QT环境下图像在窗口下等比例渲染绘制
  • 【Linux系统】Ext系列磁盘文件系统二:引入文件系统(续篇)
  • UI自动化测试:异常截图和page_source
  • 软考高级5个资格、中级常考4个资格简介及难易程度排序
  • OpenAI函数调用迎来重大升级:引入「最小惊讶原则」等软件工程实践,开发体验更上一层楼!
  • 25上半年软考《电子商务设计师》,备考大纲已出!
  • 为什么 Teams 中搜索不到 Power Automate
  • 电脑开机提示error loading operating system怎么修复?
  • 新手谷歌浏览器的使用(使用国内的搜索引擎)
  • lc238除自身以外数组的乘积——动态规划前缀积
  • Java全栈项目 - 智能小区物业管理平台开发实践
  • 新知DAC维修,换牛,
  • Rust操作符和符号全解析
  • Java对集合的操作方法
  • 面试小札:闪电五连鞭_7
  • opencv # Sobel算子、Laplacian算子、Canny边缘检测、findContours、drawContours绘制轮廓、外接矩形
  • Sentry日志管理thinkphp8 tp8 sentry9 sentry8 php8.x配置步骤, tp8自定义异常处理类使用方法
  • NSDT 3DConvert:高效实现大模型文件在线预览与转换
  • 关于llama2:从原始llama-2-7b到llama-2-7b-hf的权重转换教程
  • cesium 与 threejs 对比
  • attack xv6
  • Pytorch | 从零构建ResNet对CIFAR10进行分类
  • RabbitMQ:添加virtualHost
  • 005 QT常用控件Qwidget_上
  • 随手记:小程序兼容后台的wangEditor富文本配置链接