【C语言进阶深度学习记录】二十八 数组指针与指针数组的分析
数组指针与指针数是非常重要的概念。面试中也是经常会被问到的
文章目录
- 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语言进阶深度学习记录】二十八 数组指针与指针数组的分析相关推荐
- 【C语言进阶深度学习记录】十八 条件编译的使用与分析
文章目录 1 基本概念 1.1 代码分析 1.2 通过命令行定义宏 2 #include 的本质 2.1 解决重复包含头文件的问题 3 条件编译的应用 4 总结 1 基本概念 条件编译的行为类似于C语 ...
- 【C语言进阶深度学习记录】十九 #pragma使用与分析
文章目录 1 #pragma 概念简介 1.1 #pragma message 的用法 1.2 #pragma once 的用法 1.3 #pragma pack 的用法 1.31 struct占用的 ...
- 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用
上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...
- 【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析
本文并不讲C语言的基础 文章目录 1 空struct的大小 2 结构体与柔性数组 2.1 柔性数组的使用方法 2.2 柔性数组使用代码案例分析 3 C语言中的union分析 3.1 使用union判断 ...
- 【C语言进阶深度学习记录】十二 C语言中的:字符和字符串
文章目录 1 C语言中的单引号和双引号 1.1 双引号带来的BUG 2 总结 1 C语言中的单引号和双引号 C语言中的单引号用来表示字符字面量 C语言中的双引号用来表示字符串字面量,存储于全局的只读存 ...
- 【C语言进阶深度学习记录】十五 编译过程简介
文章目录 1 初识编译器 2 总结 1 初识编译器 我们平时口中所说的编译器,是广泛的编译器.实际上,编译器包括了以下四个部分: 一个C代码被编译为可执行代码,包括以下几个过程: 下面就对上述的各个过 ...
- 【C语言进阶深度学习记录】十四 C语言中 三目运算符和逗号表达式
文章目录 1 三目运算符 1.1 三目运算符的返回类型的代码案例分析 2 逗号表达式 2.1 逗号表达式代码案例分析 2.2 如何用一行代码实现 strlen函数 3 总结 1 三目运算符 三目运算符 ...
- 【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析
之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...
- 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)
学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...
- 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义
文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...
最新文章
- 特别的需要名言警句提醒一下自己
- rcp(插件开发) 如何查找自己定义的扩展点
- 阿里大规模业务混部下的全链路资源隔离技术演进
- routine tortoisesvn operations-1
- 为什么现在是升级到Java 8的最佳时机
- php+mysql投票代码_PHP+jQuery+MySql实现红蓝投票功能
- C++文件操作与文件流
- STM32 SPI NSS 作用
- Android文本框输入汉字,android中EditText输入类型为何不能设置为中文
- Linux的辅助数据和传递文件描述符
- Windows Phone 模拟器 (WPR Alpha 0.0.1 WP7/8模拟器) XAP XNA文件使用教程
- 云计算里的家校互联平台
- unity 素材分享
- 微信小程序分享给朋友和分享到朋友圈
- 软件测试中的80/20原则
- 0X000000该内存不能为read的解决方法(转)
- Google网盘 百度网盘文件互传-Multcloud
- 动画:从 AE 到 Web
- c语言字符型数据是,C语言字符型数据.doc
- 计算机组成与原理课程视频在线,《电子科技大学计算机组成原理视频课程42讲全 》...
热门文章
- spring mvc学习(46):自定义配置类
- 第二十一期:干货盘点!推荐程序员使用的5款工具软件
- matlab变压器损耗仿真,基于Matlab的变压器运行特性仿真专题报告.docx
- tf.name_scope tf.variable_scope学习
- 网页控制聚英继电器JY-DAM3200代码
- 集合转数组的toArray()和toArray(T[] a)方法
- 关于逻辑删除标识字段value的设定
- C# 实例练习——字符串处理(第三天)
- C# base和this
- visual studio 2005 sp1 安装错误解决