数组指针与指针数是非常重要的概念。面试中也是经常会被问到的

文章目录

  • 1 数组的类型
    • 1.1 定义数组的类型
  • 2 数组指针
    • 2.1 数组类型和数组指针的代码分析
  • 3 指针数组
    • 3.1 指针数组代码案例分析
  • 4 总结

1 数组的类型

C语言中的数组有自己特定的类型。比如 int a[5];

数组a的类型是 int[5],并不是 int类型。

  • 数组类型是由元素类型数组大小共同决定的

1.1 定义数组的类型

在C语言中可以通过typedef 为数组的类型重命名。如下:

  • 数组的类型:

  • 数组的定义:

这种写法可能有的人没见过,等看过后面的数组指针与指针数的定义的时候就知道了。

2 数组指针

  • 数组指针是一个指针,不是数组。这个指针指向一个数组。该指针需要使用取地址符 & 向数组取地址。(数组的整个地址而非数组元素首地址)
  • 可以通过数组类型来定义数组指针:ArrayType* pointer;
  • 也可以直接定义:type(*pointer)[n];

注意:上面的pointer为数组指针变量,ArrayType是数组的类型,type是数组里面元素的类型。注意区分三者的不同。

2.1 数组类型和数组指针的代码分析

分析下面的代码32-1.c:

#include <stdio.h>/* 定义数组类型 */
typedef int(AINT5)[5];
typedef float(AFLOAT10)[10];
typedef char(ACHAR9)[9];int main(){AINT5 a1; //int a1[5];float fArray[10];AFLOAT10* pf = &fArray;  //注意与float* pf = &fArray 区分ACHAR9 cArray;char(*pc)[9] = &cArray;int  i = 0;printf("%d, %d\n", sizeof(AINT5), sizeof(a1));for(i=0; i<10; i++){(*pf)[i] = i;     //注意数组指针的用法}for(i=0; i<10; i++){printf("%f\n", fArray[i]);}printf("%p, %p\n", &cArray, pc+1);   //pc是整个数组的指针,pc+1 ==》&cArray + 9return 0;
}
  • 编译运行上述代码:

分析:

  • 注意学习上面定义数组类型的方法,并使用定义的数组类型来定义数组。
  • 注意数组指针的声明与使用方法
  • 数组指针是整个数组的地址,需要使用& 号来获取
  • 代码比较简单,不多做分析

3 指针数组

  • 指针数组是一个数组,不是指针。该数组存的元素是指针。
  • 指针数组的定义: type* pArray[n];

其中 type* 是数组中存的元素的类型pArray 是数组名。如下图的指针数组:

3.1 指针数组代码案例分析

  • 代码32-2.c
#include <stdio.h>
#include <string.h>#define DIM(a) (sizeof(a)/sizeof(*a))int lookup_keyword(const char* key, const char* table[], const int size){int i=0;for(i=0; i<size; i++){if(strcmp(key, table[i]) == 0){break;}}return i>=size?-1:i;
}
int main(){const char* keyword[] = {"do","for","if","register","return","switch","while","case","static"};printf("%d\n", lookup_keyword("return", keyword, DIM(keyword)));printf("%d\n", lookup_keyword("main", keyword, DIM(keyword)));return 0;
}
  • 编译运行结果为:

4
-1

分析:

  • lookup_keyword这个函数是查找字符串数组中是否存在某一个字符串
  • table数组,就是一个指针数组,里面存的是指针。(字符串是一种常量指针)
  • 注意学会使用指针数组的使用。

4 总结

  • 数组也是有类型的:由数组的大小元素的类型共同决定的
  • 数组指针是一个指针,该指针指向对应类型的数组
  • 指针数组是一个数组,该数组中存的元素是对应类型的指针
  • 指针数组的使用与数组是一样的。但是注意指针数组在使用的时候是如何表示的。

【C语言进阶深度学习记录】二十八 数组指针与指针数组的分析相关推荐

  1. 【C语言进阶深度学习记录】十八 条件编译的使用与分析

    文章目录 1 基本概念 1.1 代码分析 1.2 通过命令行定义宏 2 #include 的本质 2.1 解决重复包含头文件的问题 3 条件编译的应用 4 总结 1 基本概念 条件编译的行为类似于C语 ...

  2. 【C语言进阶深度学习记录】十九 #pragma使用与分析

    文章目录 1 #pragma 概念简介 1.1 #pragma message 的用法 1.2 #pragma once 的用法 1.3 #pragma pack 的用法 1.31 struct占用的 ...

  3. 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用

    上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...

  4. 【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析

    本文并不讲C语言的基础 文章目录 1 空struct的大小 2 结构体与柔性数组 2.1 柔性数组的使用方法 2.2 柔性数组使用代码案例分析 3 C语言中的union分析 3.1 使用union判断 ...

  5. 【C语言进阶深度学习记录】十二 C语言中的:字符和字符串

    文章目录 1 C语言中的单引号和双引号 1.1 双引号带来的BUG 2 总结 1 C语言中的单引号和双引号 C语言中的单引号用来表示字符字面量 C语言中的双引号用来表示字符串字面量,存储于全局的只读存 ...

  6. 【C语言进阶深度学习记录】十五 编译过程简介

    文章目录 1 初识编译器 2 总结 1 初识编译器 我们平时口中所说的编译器,是广泛的编译器.实际上,编译器包括了以下四个部分: 一个C代码被编译为可执行代码,包括以下几个过程: 下面就对上述的各个过 ...

  7. 【C语言进阶深度学习记录】十四 C语言中 三目运算符和逗号表达式

    文章目录 1 三目运算符 1.1 三目运算符的返回类型的代码案例分析 2 逗号表达式 2.1 逗号表达式代码案例分析 2.2 如何用一行代码实现 strlen函数 3 总结 1 三目运算符 三目运算符 ...

  8. 【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析

    之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...

  9. 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...

  10. 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义

    文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...

最新文章

  1. 特别的需要名言警句提醒一下自己
  2. rcp(插件开发) 如何查找自己定义的扩展点
  3. 阿里大规模业务混部下的全链路资源隔离技术演进
  4. routine tortoisesvn operations-1
  5. 为什么现在是升级到Java 8的最佳时机
  6. php+mysql投票代码_PHP+jQuery+MySql实现红蓝投票功能
  7. C++文件操作与文件流
  8. STM32 SPI NSS 作用
  9. Android文本框输入汉字,android中EditText输入类型为何不能设置为中文
  10. Linux的辅助数据和传递文件描述符
  11. Windows Phone 模拟器 (WPR Alpha 0.0.1 WP7/8模拟器) XAP XNA文件使用教程
  12. 云计算里的家校互联平台
  13. unity 素材分享
  14. 微信小程序分享给朋友和分享到朋友圈
  15. 软件测试中的80/20原则
  16. 0X000000该内存不能为read的解决方法(转)
  17. Google网盘 百度网盘文件互传-Multcloud
  18. 动画:从 AE 到 Web
  19. c语言字符型数据是,C语言字符型数据.doc
  20. 计算机组成与原理课程视频在线,《电子科技大学计算机组成原理视频课程42讲全 》...

热门文章

  1. spring mvc学习(46):自定义配置类
  2. 第二十一期:干货盘点!推荐程序员使用的5款工具软件
  3. matlab变压器损耗仿真,基于Matlab的变压器运行特性仿真专题报告.docx
  4. tf.name_scope tf.variable_scope学习
  5. 网页控制聚英继电器JY-DAM3200代码
  6. 集合转数组的toArray()和toArray(T[] a)方法
  7. 关于逻辑删除标识字段value的设定
  8. C# 实例练习——字符串处理(第三天)
  9. C# base和this
  10. visual studio 2005 sp1 安装错误解决