数组和指针类似于vector和迭代器。

区别在于:数组的长度是固定的.数组一经创建,就不允许添加新的元素.指针则可以像迭代器一样用于遍历和检查数组中的元素.

设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针.

没有所有元素都是引用的数组.

1.在函数体外定义的内置数组,其元素均初始化为0;

2.在函数体内定义的内置数组,其元素无初始化;

不管数组在哪里定义,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化;如果该类没有默认构造函数,则必须为该数组的元素提供显示初始化。

除非显示地提供元素初值,否者内置类型的局部数组的元素没有初始化。此时,除了给元素赋值外,其他使用这些元素的操作没有定义.

include "stdafx.h"
#include <iostream>
#include <string>
#include<bitset>
using namespace std;
int a[3];
int _tmain(int argc, _TCHAR* argv[])
{  
cout<<a[1]<<endl;//输出0
int b[3];
cout<<b[1]<<endl;//输出一个乱七八糟的很大的负数
return 0;
}

 

 

特殊的字符数组:

初始化字符数组,1,既可以用一组由花括号括起来,逗号隔开的字符字面值进行初始化。2,也可以用一个字符串字面值进行初始化。注意:字符串字面值包含一个额外的空字符(null)用于结束字符串。当使用字符串字面值来初始化创建的新数组时候,将在新数组中假如空字符:

 

char ca1[]={'c','+','+'};
char ca2[]={'c','+','+','\0'};
char ca3[]="c++";
cout<<sizeof(ca1)/sizeof(ca1[1])<<endl;//3
cout<<sizeof(ca2)/sizeof(ca2[1])<<endl;//4
cout<<sizeof(ca3)/sizeof(ca3[1])<<endl;//4

 

const char ca3[6]=”Daniel”//错误,这里是有7个元素的.因为是字符串字面值.

注意不要用一个数组去给另外一个数组进行赋值操作

 

用下标访问元素时,vector使用vector::size_type作为下标的类型,而数组下标的正确烈性是size_t;

指针可能的取值

一个有效的指针必然是以下三种状态之一:保存一个特定对象的地址;指向某个对象后面的另一个对象;或者是0值。若指针保存0值,表明它不指向任何对象。未初始化的指针是无效的,知道给该指针赋值后。

避免使用未初始化的指针,很多运行时错误都源于使用了未初始化的指针。

如果可能的话,除非所指向的对象已经存在,否者不要先定义指针,这样可避免定义一个未初始化的指针。如果必须分开定义指针和其所指向的对象,则将指针初始化为0.因为编译器可以检测出0值的指针,程序可判断该指针并未指向一个对象。

 

把int型变量赋给指针是非法的,尽管此int型变量的值可能是0,单允许把数值0 或者在编译时可获得0值的const量赋给指针:

int ival;

int zero = 0;

const int c_ival = 0;

int *pi = ival;//error;

pi = zero;//error

pi = c_ival;//ok

pi = 0;//ok

指针初始化或赋值时必须保证类型匹配。

 

指向指针的指针:

int ival = 1024;
int *p = &ival;
int **p1 = &p;
int * p2 = *p1;
cout<<*p2<<endl;//1024
cout<<**p1<<endl;//1024

C风格字符串

字符串字面值的类型是字符常量的数组。字符串字面值的类型就是const char类型的数组。实际上,C风格字符串既不能确切地归为C语言类型,也不能归结为C++语言的类型,而是以空字符null结束的字符数组.

C++语言通过(const) char*类型的指针来操纵C风格字符串。一般来说,我们使用指针的算数操作来遍历C风格字符串,每次对指针进行测试并递增1,直到到达结束符null为止:

const char *cp = “some value”;

while(*cp)

{

      ++cp;

}

如果cp所指向的字符数组没有null结束符,则此循环将会失败。这时候,循环会从cp指向的位置开始读数,知道遇到内存中某处null结束为止。

动态数组:

虽然动态数组的长度是固定的,但是动态分配的数组不必在编译时候知道其长度,可以在运行时才确定数组长度.与数组变量不同,动态分配的数组将一直存在,知道程序显示释放它为止.

动态数组的定义: int *pia =new int[10];

new表达式需要指定指针类型以及在方括号中给出的数组维数,该维数可以是任意的复杂表达式。创建数组后,new将返回指向数组第一个元素的指针。在自由存储区中创建的数组对象是没有名字的,程序员只能通过其地址间接地访问堆中的对象。

如果数组元素是类类型,则使用默认构造函数实现初始化,如果是内置类型,则无初始化:

string *psa = new string[10]//无初始化

可以使用数组长度后面的一对空圆括号,对数组元素做值初始化

int *pia2= new int[10]();

对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的值。

动态空间的释放

C++语言为指针提供delete []表达式释放指针所指向的数组空间:

delete [] pia;

 

混合使用标准库string和c风格字符串。

string st3(“hello world”);可以欧诺个字符串字面值初始化string类对象。

在要求C风格的字符串的地方不可以直接使用标准库string类型对象。

const char *str = st2.c_str();//ok

因为c_str()返回的指针指向const char类型的上诉组,所以这样做是为了避免修改该数组。

Primer回顾 数组和指针的更多相关文章

  1. c++ primer 4 数组和指针

    类比的思想学习数组和指针,c++提供类似于vector和迭代器的低级复合类型——数组和指针.与vector相似,数组可以保存某一种类型的一组对象:而他们的区别在于,数组的长度固定,数组一经创建就不允许 ...

  2. 把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另 ...

  3. 【C语言学习】《C Primer Plus》第10章 数组和指针

    学习总结 1.数组初始化方式: int a[]={1,2,3} int a[SIZE]={1,2,3} //SIZE是宏定义,数组初始化个数不能大于SIZE,否则报错:当个数小 //SIZE,自动补0 ...

  4. C++ Primer 随笔 Chapter 4 数组和指针

    1.数组:数组是由类型名.标识符和维数组成的符合数据类型,类型名规定了存放在数组中的元素类型,维数规定数组中包含元素的个数而标识符就是数组的名称.例如: int  arr[10]; 其中 int 是类 ...

  5. C Primer Plus 第10章 数组和指针 编程练习

    这章感觉好难啊,放个别人的总结. // 多维数组和指针 #include <stdio.h> int main(void) { int zippo[4][2] = {{2, 4}, {6, ...

  6. C Primer Plus学习笔记(九)- 数组和指针

    数组 数组由数据类型相同的同一系列元素组成 需要使用数组时,通过声明数组告诉编译器数组中内含多少元素和这些元素的类型 普通变量可以使用的类型,数组元素都可以用 float candy[365]; // ...

  7. C++ Primer高速入门之六:数组和指针

    更新:勘误,delete [] 猪 我们知道,C语言以及早期的面向结构的语言差点儿都支持数组定义.比方整形数组int 女神[2].表示有俩数: 女神[0], 女神[1].她们都是整数. C++ 语言为 ...

  8. C++数组和指针

    <C++ Primer 4th>读书摘要 与 vector 类型相似,数组也可以保存某种类型的一组对象:而它们的区别在于,数组的长度是固定的.数组一经创建,就不允许添加新的元素.指针则可以 ...

  9. 深入解析C语言数组和指针

    概述 指针是C语言的重点,同时也是让初学者认为最难理解的部分.有人说它是C语言的灵魂,只有深入理解指针才能说理解了C语言.暂且撇开这些观点不谈.这章是我在阅读<C和指针>这本书的读书笔记. ...

随机推荐

  1. 谁能举个通俗易懂的例子告诉我IAAS,SAAS,PAAS的区别?【转自知乎】

    是时候祭出这篇吃货文章了: ———————————————————— ———————————————————— ———————————————————— &amp;amp;amp;amp;lt ...

  2. 按模板导出Excel

    说明:开发环境 vs2012 asp.net mvc4 c# 注意:Excel模板有多个sheet页,导出Excel的时候,同时给多个sheet页填充数据 1.项目结构 3.Excel模板(注意she ...

  3. Swift 学习笔记 (继承)

    一个类可以从另一个类继承方法.属性和其他的特性.当一个类从另一个类继承的时候,继承的类就是所谓的子类,而这个类继承的类被称为父类. 在 Swift 中类可以调用和访问属于它们父类的方法.属性和下标脚本 ...

  4. MethodDispatcher—Cherrypy对REST的支持

    前言 CherryPy是Python的一个Web框架,通过MethodDispatcher内建了对REST的支持,而且使用非常方便. 示例 首先,我们需要有一个符合REST风格的资源(Resource ...

  5. windows下python安装face_recognition模块

    安装face_recognition出现报错,要先安装dlib 安装dlib时报错,要先安装cmake cmake安装成功后,用pip安装dlib失败 从pypi下载dlib的wheel文件,然后用w ...

  6. linux 下ftp的安装配置 图文教程

    0.安装ftp的前置条件是关掉SElinux # vi /etc/selinux/config 修改 SELINUX=” disabled ” ,重启服务器.若相同,则跳过此步骤. 1. 可先查看是否 ...

  7. P5105 不强制在线的动态快速排序

    P5105 不强制在线的动态快速排序 $\bigoplus \limits_{i=2}^n (a_i^2-a_{i-1}^2) = \bigoplus \limits_{i=2}^n (a_i-a_{ ...

  8. Python环境问题

    http://installion.co.uk/ubuntu/precise/main/p/python3.2/uninstall/index.html

  9. Dictionary and KeyValuePair关系

    简单一句话: Dictionary 是 由 KeyValuePair结构 组成的集合 The Dictionary<TKey, TValue>.Enumerator.Current pro ...

  10. BZOJ 1626 [Usaco2007 Dec]Building Roads 修建道路:kruskal(最小生成树)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1626 题意: 有n个农场,坐标为(x[i],y[i]). 有m条原先就修好的路,连接农场( ...