数组指针

  在揭开数组指针神奇的面纱之前,我们先来探讨一下数组是否有自己特定的类型呢?

1. 数组类型

  我们知道数组是相同类型变量的有序集合。例如 int a[5] = {0};,其含义就是 5int 类型变量集合在一起由数组 a 管理。那么我想问一下,数组 a 的类型是什么呢?

  如果读者是正在C语言求学道路上的话,那么你的答案应该是 int 类型。但是我想说的是,很不好意思,这个答案是错的,那么接下来就为大家揭晓答案。

  首先,我们要明确一点:

在 C 语言中,数组有自己特定的类型。

  那么,数组的类型又是什么呢?

数组的类型由数组中的元素类型和数组大小决定。

  因此,上面所定义的数组 a 的类型是 int[5],而不是 int

2. 定义数组类型

  明白数组的类型之后,我们就可以通过定义数组类型,来换一种方式来创建数组。

  在 C 语言中,可以通过 typedef 关键字为数组类型重命名:

typefet type(name)[size];
  • int 为数组中元素的数据类型
  • name 为将要创建的数组类型的名字
  • size 为将要创建的数组的元素个数

示例:

  • 定义数组类型
// 定义数组中元素类型为 int、数组元素个数为 5 的数据类型为 AINT5// 定义数组中元素类型为 float、数组元素个数为 10 的数据类型为 AFLOAT10
typedef float(AFLOAT10)[10];
  • 声明数组
// 声明一个数据类型为 AINT5、数组名为 iArray 的数组
AINT5 iArray;
// 声明一个数据类型为 AFLOAT10、数组名为 fArray 的数组
AFLOAT10 fArray;

  现在大家应该明白了数组类型怎么去创建了吧。但是又出现个问题,比如 int 类型占 4 个字节、char 类型占 1 个字节,那么数组类型的大小是多少呢?

  下面通过一个例子来说明一下:

typedef int(AINT5)[5];
  • AINT5 数组类型说包含的数组元素为 int 类型,共包含 5 个元素
  • 由于每个 int 类型占用4个字节的内存空间
  • 因此,AINT5 所占用的内存空间为 20 个字节

  同理,通过上面可以推导出一个计算公式:

sizeof(TypeArray) = sizeof(type)·size
  • TypeArray 为数组类型
  • type 为数组类型中元素的类型
  • size 为数组类型所包含的数组元素个数

  那么,对于任意种类的数组类型所占内存空间的大小都可以通过这个公式进行计算,同时通过某个数组类型创建的数组所占空间的大小即为数组类型所占空间的大小

  到此为止,我们对数据类型应该了如指掌了吧。下面开始真正的话题 数组指针

3. 数组指针

  前面我们讲了一大堆关于数组类型的本质、数组类型的创建。那么你们可能会想数组类型也没有多大神奇,无非不就是换一种方式声明声明数组吗?我想说的是,有了数组类型,我们便可以定义数组指针了,你们想一想是不是呢。

  首先,我们先来回想一下指针声明的语法结构:

(type)* name = NULL;
  • type 为声明的这个指针的类型
  • name 为这个指针的名字

  通过指针声明的语法结构,我们可以定义 intfloatchar 等类型的指针。那么,现在有了数组类型,不就轻而易举的创建数组指针了吗。

(1)可以数组类型定义数组指针:

ArrayType* pointer;
  • ArrayType 为数组类型
  • pointer 为数组指针的名字

(2)可以通过数据类型直接定义:

type(*pointer)[n];
  • pointer 为数组指针变量名
  • type 为指向的数组的类型
  • n 为数组的元素个数

  截止到现在,我们明白了数组指针怎么创建,下面我们通过一个 demo 加深一下印象。

#include <stdio.h>// 对数组元素为 int、数组元素个数为 5 的数组重命名为 AINT5
typedef int(AINT5)[5];
// 对数组元素为 flaot、数组元素个数为 10 的数组重命名为 AFLOAT10
typedef float[AFLOAT10][10];
// 对数组元素为 char、数组元素个数为 9 的数组重命名为 ACHAR9
typedef char[ACHAR9][9];int main()
{// 声明一个数组类型为 AINT5、数组名字为 iArray 的数组AINT5 iArray;// 声明一个数组元素类型为 float、数组元素个数为 10、数组名字为 fArray 的数组float fArray[10];// 声明一个类型为 AFLOAT10、名字为 pfArray,并且值为数组 fArray 的地址的数组指针AFLOAT10* pfArray = &fArray;// 声明一个数组类型为 ACHAR9、数组名字为 cArray 的数组ACHAR9 cArray;// 声明一个类型为 char、元素个数为 9、名为 pc 并且值为 cArray 的数组指针char(*pc)[9] = &cArray;/*首先 cArray 是数组 cArray 首元素的地址,其类型为 char*char(*pcw)[4] 为一个数组指针,其要指向某个数组存储空间因此 char(*pcw)[4] = cArray; 报错*/// char(*pcw)[4] = cArray;int i = 0;// 输出数组类型 AINT5 所占内存空间、数组 iArray 的大小printf("%d, %d\n", sizeof(AINT5), sizeof(iArray));for(i=0; i<10; i++){// pfArray 为一个指针,其保存的值为数组 fArray 的地址,那么 *pfArray 所指向的内容便是 fArray,即 *pfArray = fArray// (*pfArray)[i] = i == fArray[i] = i(*pfArray)[i] = i;}for(i=0; i<10; i++){// 将数组 fArray 中的数组元素遍历输出printf("%f\n", fArray[i]);}/* 由于 pc 是一个指针,由指针运算得:pc+1 = (unsigned int)pc + a·sizeof(*pc)其中 sizeof(*pc) 为 pc 所指向的目标,即数组 cArray(unsigned int)pc 为 pc 所保存的值,即数组 cArray 的地址值pc+1 = &cArray + 9*//* 由于 pcw 是一个指针,由指针运算得:pcw+1 = (unsigned int)pcw + a·sizeof(*pcw)其中 sizeof(*pcw) 为 pcw 所指向的目标为:有 4 个 char 类型的元素构成,因此 sizeof(*pcw) = 4(unsigned int)pcw 为 pcw 所保存的值,即数组 cArray 首元素地址值pcw+1 = &cArray + 9*/printf("%p, %p, %p\n", &cArray, pc+1, pcw+1);return 0;
}

  上面这个 demo 中所有的代码的含义都通过注释的方式在文中标注出。同时,通过这个 demo 我们可以很清晰的对数组类型所占空间的大小及数组类型的创建、数组指针的创建及使用了如指掌。

  通过上面这个 demo 能够得出如下结论:

  • 指针运算适用于任何类型的指针
  • 数组指针与普通指针类似,无非指向的内容的是 数组 而已

玩转C语言之数组-数组指针相关推荐

  1. c语言数组实际作用,要玩转C语言 就要深入指针和数组这两个概念

    原标题:要玩转C语言 就要深入指针和数组这两个概念 指针 预备知识 在深入理解指针之前,我认为有必要先复习或者学习一下计算机原理的基础知识. 计算机是如何从内存中进行取指的? 计算机的总线可以分为3种 ...

  2. C语言复习篇之数组与指针

    C语言复习篇之数组与指针 学习了一段时间的嵌入式linux了,学习中有很多的东西需要总结,有经验有教训,我觉得把他写下来会更好,就当做是一种笔记的形式,记录学习中的点点滴滴,不仅仅自己可以经常复习,也 ...

  3. C语言再学习 -- 再论数组和指针

    之前有总结指针数组,但是现在看来总结的太简单了.好多重要的知识点都是一带而过的.本想在后面添加后来想想算了,还是再写一篇文章来详细介绍数组和指针这对冤家吧. 之前总结的,参看:C语言再学习 -- 数组 ...

  4. 悠漓带你玩转C语言(数组)

    1. 一维数组的创建和初始化. 1.1 数组的创建 数组是一组相同类型元素的集合 数组的创建方式: type_t arr_name [const_n]; //type_t 是指数组的元素类型 //co ...

  5. C语言笔记含源码(变量、输入输出、分支、循环、函数、数组、指针、字符串、结构体)小总结

    文章目录 一.变量与输入输出 二.分支语句 三.循环 四.函数 五.数组 六.指针 七.字符串 八.结构体 一.变量与输入输出 定义变量需要:类型.变量名.变量值(可有可无) #include < ...

  6. go语言基础(二)函数,数组,指针,结构体

    目录 函数 匿名函数 函数闭包的简单使用以及获取键盘输入 闭包加上函数多返回值 为什么闭包不会被垃圾回收 defer 内置函数panic.recover 语言变量作用域 数组 数组定义 数组+函数+宏 ...

  7. 【C语言】深入理解数组和指针——初识指针

    哈喽大家好,我是保护小周ღ,C语言,接下来给大家带来的是深入理解数组和指针的初识指针,这篇主要讲的是基础指针的相关知识,是博主的所见所闻,细节上的知识后面会这里面没有提,会放在后期的文章中与数组相结合 ...

  8. 关于C语言中的数组指针、指针数组以及二级指针

    概念解释 数组指针:首先它是一个指针,它指向一个数组,即指向数组的指针:在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道.数组指针指向的是数组中的一个具体元素,而不是整个数组,所 ...

  9. 【C 语言】二级指针作为输入 ( 指针数组 | 复杂指针解读 )

    文章目录 一.指针数组 二.复杂指针解读 三.数组指针代码示例 一.指针数组 定义一个数组指针 : 数组中的 元素 是 指向 字符串的指针 , 即 每个数组元素 只有 4 字节 ; char *arr ...

  10. 【C 语言】数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )

    文章目录 前言 一.数组符号 [] 与 指针 * 符号 使用效果 基本等价 二.数组首地址 与 指针 本质区别 前言 参考 [C 语言]指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方 ...

最新文章

  1. c#中一个简单的深拷贝方法
  2. Linux复习资料——一篇文章学会安装Java(免环境配置)以及tomcat服务
  3. javaMail邮件发送
  4. Windows下深度学习标注工具LabelImg安装和使用指南
  5. NativeXml (2):对象建立
  6. NET4.0新功能之String.IsNullOrWhiteSpace() 方法
  7. jdk中ArrayList的实现
  8. 俄罗斯方块(C语言实现)
  9. 如何将MKV的字幕提取出来
  10. layui实现后台管理系统界面:对示例代码改动几处即可轻松实现(转载)
  11. Origin画图技巧之设置框图默认设置
  12. 10行代码,带你理解自然底数e、自然指数ln
  13. Pytorch + Win10系统 + pip安装+ CUDA9.1版本(安装CUDA10.2版本)
  14. html后台登录界面网页设计界面
  15. ps3slim安装linux,PS3 Slim配置详解 新旧款真机对比
  16. VC6.0 MFC 模拟弹簧运动(改进版)
  17. 知名软件ADSafe暗藏恶意代码 从众多网站劫持流量
  18. 上传图片时总是提示“非法图像文件”
  19. ERP的概念、简介与发展历程
  20. 2015年蓝桥杯A组C/C++ 第二题星系炸弹

热门文章

  1. 关于 ST mems传感器开发的一些技术分享
  2. linux iconv函数失败,Linux 编码转换 (iconv失败的解决方法)
  3. 先验概率vs后验概率
  4. 荒岛野人[exgcd]
  5. Codeforces 1149 题解
  6. BZOJ 2959 长跑 (LCT、并查集)
  7. AtCoder AGC022C Remainder Game (图论)
  8. python识别验证码ocr_Python 验证码识别-- tesserocr
  9. 模版引擎总结之综合分析模版引擎
  10. oracle学习笔记5:pl/sql流程控制语句