《C Prime Plus》第十节笔记
数组和指针
10.1 数组
10.1.1 初始化数组
标量变量:只储存单个值的变量
创建只读数组,应该用const声明和初始化数组
const int days[] = {1,2,3,5};
省略方括号中的数字,编译器会自动匹配数组大小和初始化列表中的项数
10.1.2 指定初始化容器 c99
例:
int arr[6] = {[5]=212};
- 重要特性一:如果指定初始化容器后面又更多的值,如[5]=4,22,566;那么后面这些值将被用于初始化指定元素的后面的元素
- 重要特性二:初始化可以覆盖之前的初始化
10.1.3 给数组元素赋值
10.1.4 数组边界
- 使用越界的数组会造成意外错误,例如改变其他数组元素的值,或是导致程序异常终止
10.1.5 指定数组的大小
int n=5;
int arr[n];
- 以上的初始化方式在c99之前不允许,而c99允许这样做。这创建了一种新的数组:VLA
- VLA成为变长数组(variable-length array)
10.2 多维数组
10.3 指针和数组
数组名是数组首元素的地址
arr == &arr[0];
指针的加减是它所指向类型的大小加减
10.4 函数、数组和指针
- int ar[]和int *ar形式都表示ar是一个指向int的指针,但是,int ar[]只能用于声明形式参数,第二种可以改变数组内容。
10.4.1 使用指针形参
- 用函数处理数组
- 一个指针形参标识数组开始,另一个整数形参表示待处理数组元素个数。
- 一个指针指向数组的开始处,另一个指向数组的结束处。
- C 保证在给数组分配空间时,指向数组后面第一个位置的指针仍是有效的指针。
10.4.2 指针表示法和数组表示法
10.5 指针基本操作
- 分别是:
- 赋值
- 解引用
- 取址
- 指针和整数相加
- 递增指针
- 指针减去一个整数
- 递减指针
- 指针求差
- 比较
- C 只能保证指向数组任意元素的指针和指向数组后面第1个位置的指针有效。
- 千万不要解引用未初始化的指针,否则可能会擦写数据或代码。
- 指针的第一个基本用法是在函数间传递信息,第二个基本用法是用在处理数组的函数中。
10.6 保护数组中的数据
10.6.1 对形式参数使用const
- 不能修改数组中的数据内容,保护原始数据
10.6.2 const的其他内容
- const指针虽然不能修改其所指向的数据,但可以使其指向其他地址。
- 把const数据或非const数据的地址初始化为指向const的指针或为其赋值时合法的。
- 而普通指针只能被赋予非const数据的指针
- const 类型 * -> 定值,不可被修改
- 类型 const * -> 定地址,不可被修改
- const 类型 *const -> 值与地址都不可被修改
10.7 指针和多维数组
地址的地址或指针的指针就是双重间接的例子
int arr[4][2]; arr==&arr[0];
arr[0]==&arr[0][0];
最好用简单的数组表示法,而不是指针表示法。
10.7.1 指向多维数组的指针
声明:
int (* p)[2]; //p是指向一个内含两个int类型的数组的指针
//而[]的优先级高于*,我们可以省去括号:
//[]先和p结合成数组,然后*表示p内含指针
int * p[2]; //p是一个内含两个指针元素的数组,每个元素都指向int的指针
10.7.2 指针的兼容性
10.7.3 函数和多维数组
如果arr是二维数组,arr[]就是一维数组,可将其视为二维数组的一行
一般而言,声明一个指向N维数组的指针时,只能省略最左边方括号中的值:
int sum4d(int arr[][20][30][15] , int rows );
10.8 变长数组(VLA)
C99新增了变长数组(variable-length array,VLA),允许使用变量表示数组的维度,如下:
int quarter = 4;
int regions = 5;
double VLA[quarter][regions]; //一个变长数组VLA
变长数组不能改变大小,这里的“变”的意思是:在创建数组时,可以使用变量指定数组的维度。
声明一个带二维变长数组参数的函数,要注意顺序:
int sun2d(int rows, int cols,int ar[rows][cols] );
变长数组还允许动态内存分配,可在程序运行时指定数组大小。普通的C数组都是静态内存分配,即在编译时确定数组大小。
10.9 复合字面量
C99新增了复合字面量(compound literal),字面量是除符号常量外的常量。
int diva[2] = {10,20}; //一个普通的数组声明
(int [2]) {10,20} //复合字面量
(int []) {10,20} //复合字面量也可以省略大小,编译器自动计算
因为复合字面量是匿名的,所以不呢个先创建后使用它,必须在创建的同时使用它。使用指针记录就是一种用法:
int *pl;
pl = (int []) {10,20}; //这个与diva数组完全相同
10.10 关键概念
- 数组用于储存相同类型的数据,C把数组看作是派生类型
- 在把数组名作为实际参数时,传递给函数的不是整个数组,而是数组的地址。
《C Prime Plus》第十节笔记的更多相关文章
- 《C Prime Plus》第九节笔记
第九节 函数 9.1 复习函数 函数原型 function prototype 函数调用 function call 函数定义 function definition 形参 实参 典型的ANSI C函 ...
- 安卓第十天笔记-fragment
安卓第十天笔记-fragment Fragment(片段) 一.Fragment简介 *Fragment是3.0引入的API,主要为了解决平板,大屏幕手机显示问题 *Fragment代表了Activi ...
- centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobackupex/Xtrabackup 第四十节课
centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobacku ...
- 第十节:详细讲解一下Java多线程,随机文件
前言 大家好,给大家带来第十节:详细讲解一下Java多线程,随机文件的概述,希望你们喜欢 多线程的概念 线程的生命周期 多线程程序的设计 多线程的概念 多线程的概念:程序是静态的,进程是动态的.多进程 ...
- 第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理
第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理 将一个app下的models数据库表注册到xadmin后台管理 重点 ...
- 第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页
第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time ...
- 第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本概念
第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本概念 elasticsearch的基本概念 1.集群:一个或者多个节点组织在一起 2.节点 ...
- 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求
第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求 selenium模块 selenium模块为 ...
- 第三百四十节,Python分布式爬虫打造搜索引擎Scrapy精讲—css选择器
第三百四十节,Python分布式爬虫打造搜索引擎Scrapy精讲—css选择器 css选择器 1. 2. 3. ::attr()获取元素属性,css选择器 ::text获取标签文本 举例: extr ...
随机推荐
- 用Pandas Dataframe支撑起多只金融产品股票的数据内部形态
3. 如果同时拿一个板块股票的收市价和成交额 前一篇说到,用大盘指数,如恒生指数,上证,深证,这些重要的大盘指数来做Dataframe主键,那麽如果是同时拿一个板块股票的收市价和成交额,可以怎样操作呢 ...
- Java中Scanner类在nextInt()后无法输入nextLine()的问题
首先,Scanner是一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫描并读入数据的,而我们在控制台中输入的数据也都是被先存入缓冲区中等待扫描器的扫描读取.这个扫描器在扫描过程中判断停止的依据就是 ...
- 吴裕雄--天生自然 PHP开发学习:For 循环
<?php for ($i=1; $i<=5; $i++) { echo "The number is " . $i . "<br>"; ...
- IDEA抽取方法的快捷键
正常的话是 ctrl+alt+m 如果快捷键占用或者修改过,在写代码的地方右键->refactor->extract->method
- Opencv从文件中播放视频
1.VideoCapture()括号中写视频文件的名字,在播放每一帧的时候,使用cv2.waitKey()设置适当的持续时间,太低会播放的很快,太高会很慢,通常情况下25毫秒就行了. 2.获取相机/视 ...
- 提高js性能的方法
1.文档瘦身 (1)删除注释(版权及法律声明部分应保留),运行时不需要注释. (2)删除制表符.空格和换行符,这些只是为了便于程序的维护,但是与执行无关. (3)替换长的变量名为短的变量名. (4)使 ...
- HttpClient4.x 上传文件
https://blog.csdn.net/wsdtq123/article/details/78888734
- Django框架(九):视图(二) HttpRequest对象、HttpResponse对象
1. HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象,这个对象不需要我们创建,直接使用服务器构造好的对象就可以.视图的第一个参数必须是HttpR ...
- share团队冲刺8
团队冲刺第八天 昨天:完善代码,解决其中的问题 今天:将除登陆界面之外的界面进行修改和完善,使其美观 问题:bindview不会用,使用时出现问题
- LIINQ TO JS
记录一下,方便自己查找... 自己在开发前端时,对于处理JSON,觉得真是枯燥.处理数据,基本都要循环. 所以我想着前端也能跟后端一样,有Linq来处理我的JSON对象就好了.上网一搜,找到了JSLI ...