【C语言】指针数组 VS 数组指针 原来这么简单!


公粽号「专注Linux」,专注Linux内核开发

本文讲解C语言中的指针数组数组指针的区别,相信这是一个让很多初学者头疼的难点,让我们来掀开它的神秘面纱!

速览全文
0.前置知识
1.各自定义
2.代码举例

〇、前置知识

本篇内容是关于指针和数组的综合篇,内容较为复杂,如果基础不牢,很容易绕,建议先看下面两篇文章,巩固数组和指针的基础:

(直接点击下面的图片可以直接跳转)

C语言数组基础


C语言指针基础


一、定义

其实,不管是指针数组还是数组指针,在中间加一个就好了,比如指针数组,也就是指针的数组,那显然这是数组,里面的元素是指针;数组指针,也就是数组的指针,那显然这是指针,这个指针指向一个数组。

1.指针数组

指针的数组

指针数组解释
是什么是一个数组。
里面装什么指针。
总结指针数组是一个数组,数组里面的每一个元素都是一个指针

这就完了?嗯,完了。怎么样,是不是很神奇!这就是理解基本概念的重要性!

1.1.代码
int a=1,b=2,c=3,d=4,e=5;
int *arr[5]={&a,&b,&c,&d,&e};//数组里面全部是指针!
//当然这里对每一个元素可以使用指针的所有初始化操作,具体见文首的推文。
1.2.代码内存图

2.数组指针

数组的指针

以下是用表格形式呈现的内容:

数组指针回答
是什么是一个指针。
里面装什么数组(的地址)。
总结数组指针是一个指针,这个指针里面存放的值是数组的地址。
或者说,将数组用指针的形式表示罢了!
2.1.代码
int a[5]={1,2,3,4,5};
int (*arr)[5]=&a;//将数组用指针的形式表示罢了!
数组指针表示法

这里的难点在于怎么表示?int a[5]显然是要将*加在类型名后面,int后面,是int* a[5]吗?那么显然是5个元素的指针数组了,显然这不对,正确的应该将标识符和*括起来,也就是:int(*a)[5],这就是有5个int元素的数组的指针!

2.2.代码内存图

二、测试代码

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    /**
     * data descp: 测试指针数组
     */
    printf("pointer_array_init:\n");
    int *pointer_array[5];
    /**
     * data descp: 使用动态初始化方式完成指针初始化
     */
    for (int i = 0; i < 5; i++)
    {
        pointer_array[i] = (int *)malloc(sizeof(int));
        *pointer_array[i] = i;
    }
    printf("pointer_array_print:\n");
    for (int i = 0; i < 5; i++)
    {
        printf("%d ", *pointer_array[i]);
    }
    /**
     * data descp: 测试数组指针
     */
    printf("\n\narray_pointer_init:\n");
    /**
     * data descp: 使用动态初始化方式完成指针初始化
     */
    int (*array_pointer)[5] = (int (*)[5])malloc(sizeof(int) * 5); /*开辟的存放的5个元素的数组,指针指向这块地址*/
    int arr[5] = {6, 7, 8, 9, 0};
    array_pointer = &arr;
    printf("array_pointer_print:\n");
    for (int i = 0; i < 5; i++)
    {
        printf("%d ", (*array_pointer)[i]); /*(*arr)代表这块内存的内容,[i]代表索引*/
    }
    return 0;
}

结果

pointer_array_init:
pointer_array_print:
0 1 2 3 4

array_pointer_init:
array_pointer_print:
6 7 8 9 0

结尾

好了,本节我们讲述了指针的基础知识,不管千变万化,我们只需要记住本质是什么,里面装什么,就能迎刃而解!同时,别忘了加上一个,这样很容易理解!

下面让我们再次回顾这两个概念:

表示解释代码
指针数组指针的数组,一个装着指针的数组。int* arr[5]
等价于(int*) arr[5]
数组指针数组的指针,一个装着数组地址的指针。int(*arr)[5]

如果您不能对着这个表格给出每一项的讲解,那么,再把上面的内容好好复习一遍吧!



汇编语言

😉【汇编语言】1—基础硬件知识

😉【汇编语言】2—寄存器基础知识

😉【汇编语言】3-寄存器与内存的交互

😉【汇编语言】4-第一个完整的汇编程序

😉【汇编语言】5-[BX]和loop指令

😉【汇编语言】6-包含多个段的程序

😉【汇编语言】7-灵活的5大寻址方式

😉【汇编语言】8-1-数据的位置

😉【汇编语言】8-2-数据的长度

😉【汇编语言】8-数据处理的两个基本问题(位置与长度)

😉【DOSBox】1-debug

😉【DOSBox】2-debug可执行文件

😉【DOSBox】3-完整开发流程


C语言

本系列将直击C语言的本质基础,流利处理出各个易错、实用的实战点,并非从零开始学习C。

😉【C语言】C Token(C89 C99 C11)

😉【C语言】指针基础

😉【C语言】数组基础

😉【C语言】结构体对齐

😉【C语言】华为C语言进阶测试

😉【C语言】触发刷新到磁盘的方式总结

😉【C语言】C语言文件操作的mode详解

😉【C语言】C语言文件知识全讲解

😉【C语言】从extern到头文件包含的最优实践

😉【C语言】C语言的关键字与重载机制

😉【C语言】长字符串的2种处理方式

😉【C语言】C语言嵌入汇编程序

😉【C语言】指针数组 VS 数组指针 原来这么简单!

😉【C语言】深浅拷贝、传参、赋值 本质剖析

😉【C语言】find-in-linux递归搜索文件名函数

😉【C陷阱与缺陷】-1-词法陷阱

😉【C陷阱与缺陷】-2-语法陷阱

😉【C陷阱与缺陷】-3-语义陷阱


Linux101系列

专注讲解Linux中的常用命令,共计发布100+文章。

😉【Linux101-1】ls

😉【Linux101-1】ls -l命令输出结果全解析

😉【Linux101-2】cd

😉【Linux101-3】cat

😉【Linux101-4】tac

😉【Linux101-5】head

😉【Linux101-6】tail

😉【Linux101-7】pwd

😉【Linux101-8】touch

😉【Linux101-9】cal

😉【Linux101-10】bc

😉【Linux101-11】df

😉【Linux101-12】uname

😉【Linux101-13】mkdir

😉【Linux101-14】gzip

😉【Linux101-15】tar

😉【Linux101-16】lsof

😉【Linux101-17】du

😉【Linux101-18】stat


Linux102系列

本系列将精讲Linux0.11内核中的每一个文件,共计会发布100+文章。

😉【Linux102】1-Makefile

😉【Linux102】2-Makefile.header

😉【Linux102】3-system.map

😉【Linux102】4-bootsect.s

😉【Linux102】5-setup.s

😉【Linux102】6-head.s

😉【Linux102-D】/boot

😉【Linux102】7-main.c

😉【Linux102】8-kernel/asm.s

😉【Linux102】9-kernel/traps.c

😉【Linux102】10-kernel/printk.c

😉【Linux102】11-kernel/vsprintf.c

😉【Linux102】12-include/stdarg.h

😉【Linux102】13-kernel/mktime.c

😉【Linux102】14-kernel/system_call.s

😉【Linux102】18-include/signal.h

😉【Linux102】19-include/sys/types.h


Linux内核精讲系列

和Linux内核102系列不同,本系列将会从全局描绘Linux内核的各个模块,而非逐行源码分析,适合想对Linux系统有宏观了解的家人阅读。

😉【Linux】学习Linux前必备的知识点

😉【Linux】Linux内核对进程的内存抽象

😉【Linux】Linux概述1-linux对物理内存的使用

😉【Linux】软件从写下到运行的全部流程

😉【Linux】CPU的三寻址:实模式、保护模式、长模式

😉【Linux】实模式与保护模式的寻址, 这次讲明白了!

😉【Linux】linux0.11的源码目录架构

😉【Linux】Makefile机制及基础详解

😉【Linux】编译并运行Linux0.11

😉【Linux】“进进内网文”—Linux的内核结构全貌

😉【Linux】linux的中断机制

😉【Linux】linux进程描述



关于小希

😉嘿嘿嘿,我是小希,专注Linux内核领域,同时讲解C语言汇编等知识。

我的微信:C_Linux_Cloud,期待与您学习交流!

加微信请备注哦


小希的座右铭:别看简单,简单也是难。别看难,难也是简单。我的文章都是讲述简单的知识,如果你喜欢这种风格:

不妨关注、评论、转发,让更多朋友看到哦~~~🙈

下一期想看什么?在评论区留言吧!我们下期见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值