C语言指针数组和数组指针详解

C语言指针数组和数组指针详解,第1张

C语言文章更新目录

C语言学习资源汇总,史上最全面总结,没有之一
C/C++学习资源(百度云盘链接)
计算机二级资料(过级专用)
C语言学习路线(从入门到实战)
编写C语言程序的7个步骤和编程机制
C语言基础-第一个C程序
C语言基础-简单程序分析
VS2019编写简单的C程序示例
简单示例,VS2019调试C语言程序
C语言基础-基本算法
C语言基础-数据类型
C语言中的输入输出函数
C语言流程控制语句
C语言数组——一维数组
C语言数组——二维数组
C语言数组——字符数组
C语言中常用的6个字符串处理函数
精心收集了60个C语言项目源码,分享给大家
C语言核心技术——函数
C代码是怎样跑起来的?
C语言实现字符串的加密和解密
C语言——文件的基本 *** 作
使用C语言链表创建学生信息并且将信息打印输出
图解C语言冒泡排序算法,含代码分析
实例分析C语言中strlen和sizeof的区别
开发C语言的3款神器,VS2019、VScode和IntelliJ Clion
动图图解C语言选择排序算法,含代码分析
动图图解C语言插入排序算法,含代码分析

C语言实例专栏(持续更新中…)

首先来思考一个问题

什么是指针数组?什么是数组指针?

单从字面上来看似乎很难分清它们是什么,我们先来看看指针数组和数组指针的定义。


指针数组:数组类型 *数组名[数组长度];

例:int *parr[5];

数组指针:类型名 (*指针名)[数组长度];

例:int (*parr)[5];

现在我们再来通过上面的定义来分析一下指针数组和数组指针。


int *parr[5];因为优先级的关系,parr先与[]结合,说明parr是一个数组,然后再与*结合说明数组parr的元素是指向整型数据的指针。


元素分别是parr[0],parr[1]...parr[4],相当于定义了5个整形指针变量。


所以parr就是数组元素是指针的数组,本质为数组。


int (*parr)[5];``parr先与*结合,形成一个指针,该指针指向的是有5个整形元素的素组,parr就是指向数组元素地址的指针,本质为指针。


这下对指针数组和数组指针应该有了初步的了解了吧,接下来我们来通过一段代码进一步了解一下。


/*
 * @author: 冲哥
 * @date: 2022/4/12
 * @description:数组指针、指针数组
 * @公众号:C语言中文社区
 */
#include 

int main() {
    int arr[4][4] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
    int(*p1)[4];   //数组指针
    int* p2[4];    //指针数组

    p1 = arr;
    printf("使用数组指针的方式访问二维数组arr\n");
    for (int i = 0; i < 4; ++i) {
        for (int j = 0; j < 4; ++j) {
            printf("arr[%d][%d]=%d\t", i, j, *(*(p1 + i) + j));
        }
        printf("\n");
    }

    printf("\n使用指针数组的方式访问二维数组arr\n");
    for (int k = 0; k < 4; ++k) {
        p2[k] = arr[k];
    }
    for (int i = 0; i < 4; ++i) {
        for (int j = 0; j < 4; ++j) {
            printf("arr[%d][%d]=%d\t", i, j, *(p2[i] + j));
        }
        printf("\n");
    }

    return 0;
}

运行结果:

从结果可以看出我们成功的使用数组指针和指针数组的方式访问了二位数组。


在分析数组指针和指针数组是如何访问二维数组之前,我们通过下面一段代码来学习一下表示二维数组每行起始地址的方式。


/*
 * @author: 冲哥
 * @date: 2022/4/12
 * @description:数组指针、指针数组
 */
#include 

int main() {
    int arr[4][4] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
    for (int i = 0; i < 4; ++i) {
        printf("使用arr+i求得二维数组arr第%d行的起始地址为%d\n", i + 1, arr + i);
        printf("使用arr[i]求得二维数组arr第%d行的起始地址为%d\n", i + 1, arr[i]);
        printf("使用*(arr+i)求得二维数组arr第%d行的起始地址为%d\n", i + 1, *(arr + i));
        printf("使用&arr[i]求得二维数组arr第%d行的起始地址为%d\n", i + 1, &arr[i]);
    }
    return 0;
}

运行结果:

在上面的代码中,我们使用了4种方式来获得每行的起始地址,因此行起始地址的表示方式并不唯一。


下面接着分析数组指针和指针数组是如何访问二维数组的,先看数组指针的访问方式。


因为数组指针指向的是一个有4个整型元素的数组,所以可以把二维数组arr看成由4个元素arr[0],arr[1],arr[2],arr[3]组成,每个元素都是含有4个整型元素的一维数组,所以当在代码中使用p1=arr的时候,p1就指向了二维数组的第一行的首地址。


在接下来的访问中,由于p1指向的类型是int [4],所以从p1p1+1的变化值为44个字节,即p1+1=9435716


从前面的运行结果中可以发现,p1+1刚好指向第二行的起始地址。


通过p1+i刚好能够取遍每行的起始地址,有了每行的起始地址之后,就可以通过*(*(p1+i)+j)来取出二维数组中每行的每一个元素。


指针数组的访问方式要更容易一些,因为定义的指针数组p2由4个元素p2[0],p2[1], p2[2], p2[3]组成,每个元素都是一个整型指针,所以只需要在程序中取出每行的起始地址并放到p2指针数组对应的元素中,就可以访问二维数组arr中的元素了。


所以,在程序中使用指针数组和数组指针的时候,必须对它们有清晰的认识,要知道它们的本质是什么,以及如何使用。


参考书籍:C语言进阶:重点、难点与疑点解析

如果您觉得本篇文章对您有帮助,请转发给更多的人
【C语言中文社区】是一个C语言/C++视频教程、学习笔记、电子书、计算机二级资料等专注于C语言/C++编程学习者的干货知识分享平台,精选深度文章,分享优秀干货类、技能类的学习资源,帮助学习中的你。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/607192.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-14
下一篇 2022-04-14

发表评论

登录后才能评论

评论列表(0条)

保存