C++_系列自学课程_第_7_课_数组_《C++ Primer 第四版》
说到数组,大家应该都很熟悉,在C、Pascal、Java等语言中,都有数组的概念。在C++中也提供了对数组的支持。数组简单来说就是一堆相同
数据类型对象的集合。 这里要把握住两个要点: 相同的数据类型、集合。
一、数组
1、定义
数组是由数组存储的对象的类型名、标识符和数组维数组成一种复合数据类型。 类型名规定了可以存储在数组中的对象的类型, 标识符用来标识
数组,用来在程序中引用数组元素, 维数用来规定数组可以存放多少数组元素。
数组的定义如下所示:
类型名 数组标识符[n];
下面是一些数组的例子:
int iArray[10]; //定义一个数组存储int型对象,可以存储10个整型的数组。
2、访问
可以通过下标操作符访问数组元素,就和vector一样。
例如定义:
char chArray[3];
chArray[0] = 'A';
chArray[1] = 'b';
chArray[2] = '\0';
通过下标操作符访问数组的元素, 下标从0开始计算,所以最大的下标== 数组的元素个数 - 1 ; 在使用的是有要注意不能越界。
数组越界容易引起一些奇怪的错误。
3、数组元素的初始化
在定义数组的时候可以同时初始化数组中的元素。如下所示:
int iArray[3] = {10,2,3}; 这样就定义了一个整型数组,数组有三个元素,三个元素初始化为10、2、3。 即 iArray[0] = 10;
iArray[1] = 2; iArray[2] = 3; 这里用{ }的括起来的3个数字,称为初始列表。
如果提供初始列表那么可以省略定义数组的长度。例如:
int iArray[ ] = {10, 2, 3} ; 这样定义了一个整型数组,数组的长度为3。
char chArray[] = "volcanol"; 这样定义了一个字符型数组,数组的长度为9; 这里只有8个字符, 为什么会有9个元素呢,这是因为
字符串字面值在系统中默认会自动添加一个 null 字符, 就是 '\0' ; 为了添加一个存储'\0'的元素,所以最终会有9个数组元素。
还有一种情况:
int iArray[5] = {1, 2, 3} ; 这里定义了一个数组,可以存放5个元素, 但是初始化列表只提供了3个元素,还少2个元素, 这里就会有
iArray[0] = 1, iArray[1] = 2; iArray[2] = 3, iArray[3] = 0 , iArray[4] = 0;
要点:如果不提供初始化值,那么数组元素的值就和普通变量一样
1、全局数组如果是内置类型,则初始化话为0.
2、局部数组如果是内置类型,则会得到随机值。
3、如果数组是类类型,则会调用默认构造函数来初始化。如果没有默认构造函数,则必须为数组元素提供显示初始化列表。
4、数组的访问
前面说过数组和vector有点类似,而且可以通过下标访问。
下面来个实例:
int main()
{
int iArray[]; for(int i=; i != sizeof(iArray)/sizeof(int); i++)
iArray[i] = i; for(int i= ; i != sizeof(iArray)/sizeof(int); i++)
cout<<iArray[i]<<endl; return ;
}
这样就可以将 iArray数组的元素赋值为0到9;执行结果如下所示:
[root@localhost cpp_src]# g++ test.cpp
[root@localhost cpp_src]# ./a.out
要点, 在使用 sizeof操作符的时候,需要注意sizeof求的是占用的字节数,求出来的不是数组的长度。
Exp:
int main()
{
cout<<sizeof(L'a')<<endl; return ;
}
程序执行结果如下所示:
[root@localhost cpp_src]# g++ test.cpp
[root@localhost cpp_src]# ./a.out
因此下面的程序段,需要注意:
int iArray[]; for(int i = ; i != sizeof(iArray); ++i ) //错误的理解 sizeof操作符, 从而到错误的结果, 这个地方需要注意 iArray[i] = i ;
5、数组下标越界
int main()
{
string strArray[]; strArray[] = "volcanol";
strArray[] = "hi,"; cout<<strArray[]<<strArray[]<<endl; return ;
}
这里我们越界访问啦,输出结果如下:
[root@localhost cpp_src]# g++ test.cpp
[root@localhost cpp_src]# ./a.out
hi,DiƿLiƿh4��H�\iƿ~{L|���������_4����ևDiƿP�@��<iƿ+ �yƿ�yƿ�yƿ�yƿ�yƿ�yƿ≥Æ¿≥Æ¿P≥Æ¿␉≥Æ¿┌≥Æ¿/≠Æ¿_≠Æ¿≠Æ¿Ì≠Æ¿æ≠Æ¿¶£Æ¿Î£Æ¿à£Æ¿û£Æ¿·Æ¿"·Æ¿6·Æ¿G·Æ¿Z·Æ¿·Æ¿·Æ¿ ·Æ¿Á·Æ¿Î·Æ¿Ú·Æ¿<Æ¿^Æ¿┐Æ¿ ƿƿ³Æ¿ÎÆ¿ØÆ¿ Ô ! Ð ÿó« ␍ 4 {jƿi686[root@localhost cpp_src]#
这是读出,如果是写入的话, 必将导致程序错误,如果利用一些机制绕过系统的限制从用户空间跳到内核空间,那么就可能导致
内核不稳定。
6、数组不能直接直接赋值和复制
与vector不同的是,数组不能直接整体的赋值和复制,这个需要注意。
还有一个需要注意的问题。
int main()
{
string strArray[]; strArray[] = "volcanol";
strArray[] = "hi,"; cout<<strArray[]<<strArray[]<<endl; return ;
}
执行结果如下所示:
[root@localhost cpp_src]# ./a.out
hi,volcanol
这里我们看到 strArray[0] 可以整体的赋值为一个字符串字面值,为什么呢,这是因为数组的下标操作符返回的是左值, 而左值的
数据类型是string所以就可以进行整体赋值了。
数组就说到这,其他还有一些关于数组的东西,待续.................
C++_系列自学课程_第_7_课_数组_《C++ Primer 第四版》的更多相关文章
- C++_系列自学课程_第_6_课_bitset集_《C++ Primer 第四版》
在C语言中要对一个整数的某一个位进行操作需要用到很多的技巧.这种情况在C++里面通过标准库提供的一个抽象数据类型 bitset得到了改善. 一.标准库bitset类型 1.bitset的作用 bits ...
- C++_系列自学课程_第_5_课_vector容器_《C++ Primer 第四版》
再一次遇到 vector 这个单词; 每一次见到这个单词都感觉这个单词非常的 "高大上"; 数字遇到vector马上就可以360度旋转: 当 "电" 遇到vec ...
- C++_系列自学课程_第_3_课_变量和基本类型_《C++ Primer 第四版》
最近复习C++相关内容,决定在这里记录自己复习的过程. 以前写过部分文字,但是没有坚持连续写,因此学完后 基本又忘光啦,主要是没有实践,这一次决定自学完后,在这里在复习一遍增强自己的记忆和理解程度. ...
- C++_系列自学课程_第_12_课_结构体
#include <iostream> #include <string> using namespace std; struct CDAccount { double bal ...
- C++_系列自学课程_第_12_课_语句_《C++ Primer 第四版》
前面的文章说完了表达式和类型转换的部分内容,在我参考的书里面,接下来讨论的是各种语句,包括:顺序语句.声明语句.复合语句(块语句).语句作用域 .if语句.while语句.for语句.do...whi ...
- C++_系列自学课程_第_11_课_类型转换_《C++ Primer 第四版》
上次说了关于表达式的一些内容,说到还有一些关于数据类型转换的内容,今天我们接着八一八C++中的数据类型转换. 一.隐式类型转换 在表达式中,有些操作符可以对多种类型的操作数进行操作, 例如 + 操作符 ...
- C++_系列自学课程_第_10_课_表达式_《C++ Primer 第四版》
程序设计语言中大部分程序都在进行表达式的求值操作, 例如求两个数的和,求一个表达式的逻辑结果,或者通过输入输出表达式语句进行输入和输出. 这里我们对表达式进行讨论. 一.表达式 1.表达式 表达式由一 ...
- C++_系列自学课程_第_9_课_C语言风格字符串_《C++ Primer 第四版》
前面说了写关于数组和指针的内容,这次在这里讨论一下字符串,讨论一下C语言风格的字符串. 在C语言里面我们利用字符数组来对字符串进行处理, 在C++里面我们前面说过一种类类型string可以对字符串进行 ...
- C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》
C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容.指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法.C++继承这一高效 ...
随机推荐
- MySQL 体系结构
标签:MYSQL/数据库/查询原理/体系结构 概述 学习一门数据库系统首先得了解它的架构,明白它的架构原理对于后期的分析问题和性能调优都有很大的帮助,接下来就通过分析架构图来认识它. 目录 概述 架构 ...
- Nodejs初阶之express
PS: 2014/09/24 更新<Express 4.X 启航指南>,欢迎阅读和评论:) 老规矩,开头部分都是些自娱自乐的随想,想到哪写到哪... 到今天俺已经在俺厂工作俩年零几天了 ...
- salesforce 零基础学习(四十七) 数据加密简单介绍
对于一个项目来说,除了稳定性以及健壮性以外,还需要有较好的安全性,此篇博客简单描述salesforce中关于安全性的一点小知识,特别感谢公司中的nate大神和鹏哥让我学到了新得知识. 项目简单背景: ...
- Text文档编码识别方法
Text文档编码识别方法 在做文档读取的时候,时常碰到编码格式不正确的问题,而要怎么样正确识别文档的编码格式,成了很多程序员的一块心病,今天我就要试着治好这块心病,这段代码的浓缩来自上千万文档的数据分 ...
- jQuery 2.0.3 源码分析 事件体系结构
那么jQuery事件处理机制能帮我们处理那些问题? 毋容置疑首先要解决浏览器事件兼容问题 可以在一个事件类型上添加多个事件处理函数,可以一次添加多个事件类型的事件处理函数 提供了常用事件的便捷方法 支 ...
- WPF自定义控件与样式(2)-自定义按钮FButton
一.前言.效果图 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 还是先看看效果 ...
- 一张图理解prototype、proto和constructor的三角关系
× 目录 [1]图示 [2]概念 [3]说明[4]总结 前面的话 javascript里的关系又多又乱.作用域链是一种单向的链式关系,还算简单清晰:this机制的调用关系,稍微有些复杂:而关于原型,则 ...
- Android的PopWindow动画实现
转载博客:http://www.open-open.com/lib/view/open1423626956186.html 1.实现步骤 1.主布局activity_main.xml <Rela ...
- 【记录】T-SQL 分组排序中取出最新数据
示例 Product 表结构: 示例 Product 表数据: 想要的效果是,以 GroupName 字段分组,取出分组中通过 Sort 降序最新的数据,通过示例数据,可以推算出结果数据的 ID 应该 ...
- 我的编程开始(C)
一,前言 写完t-sql系列,想了想自己的编程之路,一直有个想法,把自己这两年所整理的编程知识拿出来和大家分享,本来写完t-sql是想写一些设计思想的,因为现在也是在学习和整理一些简单框架,经常泡在大 ...