数组和指针


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 使用指针形参
  • 用函数处理数组

    1. 一个指针形参标识数组开始,另一个整数形参表示待处理数组元素个数。
    2. 一个指针指向数组的开始处,另一个指向数组的结束处。
  • C 保证在给数组分配空间时,指向数组后面第一个位置的指针仍是有效的指针。
10.4.2 指针表示法和数组表示法

10.5 指针基本操作

  • 分别是:

    1. 赋值
    2. 解引用
    3. 取址
    4. 指针和整数相加
    5. 递增指针
    6. 指针减去一个整数
    7. 递减指针
    8. 指针求差
    9. 比较
  • 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》第十节笔记的更多相关文章

  1. 《C Prime Plus》第九节笔记

    第九节 函数 9.1 复习函数 函数原型 function prototype 函数调用 function call 函数定义 function definition 形参 实参 典型的ANSI C函 ...

  2. 安卓第十天笔记-fragment

    安卓第十天笔记-fragment Fragment(片段) 一.Fragment简介 *Fragment是3.0引入的API,主要为了解决平板,大屏幕手机显示问题 *Fragment代表了Activi ...

  3. centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobackupex/Xtrabackup 第四十节课

    centos   shell编程6一些工作中实践脚本   nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志  直接送给bc做计算  gzip  innobacku ...

  4. 第十节:详细讲解一下Java多线程,随机文件

    前言 大家好,给大家带来第十节:详细讲解一下Java多线程,随机文件的概述,希望你们喜欢 多线程的概念 线程的生命周期 多线程程序的设计 多线程的概念 多线程的概念:程序是静态的,进程是动态的.多进程 ...

  5. 第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理

    第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理 将一个app下的models数据库表注册到xadmin后台管理 重点 ...

  6. 第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

    第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time ...

  7. 第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本概念

    第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本概念 elasticsearch的基本概念 1.集群:一个或者多个节点组织在一起 2.节点 ...

  8. 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求

    第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求 selenium模块 selenium模块为 ...

  9. 第三百四十节,Python分布式爬虫打造搜索引擎Scrapy精讲—css选择器

    第三百四十节,Python分布式爬虫打造搜索引擎Scrapy精讲—css选择器 css选择器 1. 2. 3.  ::attr()获取元素属性,css选择器 ::text获取标签文本 举例: extr ...

随机推荐

  1. Unity3D一些基本的概念和一些基本操作

    场景:整个游戏由场景组成,一个游戏至少要有一个场景,如果把所有的游戏画面放在一个场景里也是可以的,如果游戏非常非常的大,如果所有的东西都放到一个场景里那么结构就不是那么清晰了而且处理起来就会麻烦一些, ...

  2. DevOps专题 |监控,可观测性与数据存储

    对于DevOps而言,监控是其中重要的一环,上一次的专题内容中,我们与大家分享了大型企业级监控系统的设计.今天我们将和大家从另一个角度进一步探讨互联网工程技术领域的监控设计(monitoring):系 ...

  3. UML-什么是GRASP?

    1.定义 GRASP:General Responsibility Assignment Software Pattern,即通用职责分配软件模式,使用职责进行OO设计的学习工具. 2.本书目标 1) ...

  4. 利用hutool配置发送邮件的问题 及 阿里企业邮箱526 Authentication failure 错误问题

    hutool 中发送邮件的配置的比较简单.可以参考hutool 官方的教程. 个人尝试了qq邮箱发送邮件 和 阿里企业邮箱发送邮件. 主要是配置不一样: 一.qq邮箱 qq邮箱 我的邮箱配置是: # ...

  5. ElasticSearch使用小结

    最近有个业务需求,即全文搜索关键字查询列表,因而转向ES的学习,也学习了大半个月了,做个笔记,总结下自己的学习历程. 独自学习一项新技术,总是难免走不少弯路的,在此推荐下ES的基础教程,对,好好学习官 ...

  6. BP算法推导python实现

    def sigmoid(inX):   return 1.0/(1+exp(-inX))   '''标准bp算法每次更新都只针对单个样例,参数更新得很频繁sdataSet 训练数据集labels 训练 ...

  7. SDL实践:产品经理如何驱动产品安全建设

    一.序言 本文从产品经理的角度出发,对产品经理的安全职责.产品驱动安全的内涵.工作内容.工作方法.所需安全资源.以及产品经理的安全工作量进行了分析.希望所有产品经理在没有心理负担的情况下,有目标.有方 ...

  8. PAT Basic 1043 输出PATest (20分)[Hash散列]

    题目 给定⼀个⻓度不超过10000的.仅由英⽂字⺟构成的字符串.请将字符重新调整顺序,按"PATestPATest-."这样的顺序输出,并忽略其它字符.当然,六种字符的个数不⼀定是 ...

  9. day65-CSS选择器和样式优先级

    1. CSS CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). 2.CSS语法 每个 ...

  10. [原]调试实战——程序CPU占用率飙升,你知道如何快速定位吗?

    原调试debugwindbghangprocess explorer 前言 如果我们自己的程序的CPU Usage(CPU占用率)飙升,并且居高不下,很有可能陷入了死循环.你知道怎么快速定位并解决吗? ...