本文讲解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] |
如果您不能对着这个表格给出每一项的讲解,那么,再把上面的内容好好复习一遍吧!

本系列将直击C语言的本质基础,流利处理出各个易错、实用的实战点,并非从零开始学习C。
专注讲解Linux中的常用命令,共计发布100+文章。
本系列将精讲Linux0.11内核中的每一个文件,共计会发布100+文章。
😉【Linux102】11-kernel/vsprintf.c
😉【Linux102】12-include/stdarg.h
😉【Linux102】14-kernel/system_call.s
😉【Linux102】18-include/signal.h
😉【Linux102】19-include/sys/types.h
和Linux内核102系列不同,本系列将会从全局描绘Linux内核的各个模块,而非逐行源码分析,适合想对Linux系统有宏观了解的家人阅读。
😉【Linux】Linux概述1-linux对物理内存的使用
关于小希
😉嘿嘿嘿,我是小希,专注Linux内核领域,同时讲解C语言、汇编等知识。
我的微信:C_Linux_Cloud,期待与您学习交流!

加微信请备注哦
小希的座右铭:
别看简单,简单也是难。别看难,难也是简单。我的文章都是讲述简单的知识,如果你喜欢这种风格:
下一期想看什么?在评论区留言吧!我们下期见!




被折叠的 条评论
为什么被折叠?



