数组和指针类似于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. 【BZOJ1969】[Ahoi2005]LANE 航线规划 离线+树链剖分+线段树

    [BZOJ1969][Ahoi2005]LANE 航线规划 Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由 ...

  2. 【BZOJ4861】[Beijing2017]魔法咒语 矩阵乘法+AC自动机+DP

    [BZOJ4861][Beijing2017]魔法咒语 题意:别看BZ的题面了,去看LOJ的题面吧~ 题解:显然,数据范围明显的分成了两部分:一个是L很小,每个基本词汇长度未知:一个是L很大,每个基本 ...

  3. django使用自己的setting的方法

    创建一个自己的setting xxx.setting export DJANGO_SETTINGS_MODULE="xxx.setting" 然后在项目中import原生的sett ...

  4. CrystalReport runtime的下载地址

    SAP网站的东西实在太多了,找个CrytalReport都费劲.13.*版的可以通过下面的地址下载: SAP Crystal Reports, developer version for Micros ...

  5. python mmap使用记录

    1.写文件 with open('??', 'r+b') as f: with contextlib.closing(mmap.mmap(f.fileno(), size, flags=mmap.MA ...

  6. API的理解和使用——全局命令

    全局命令 命令 功能 set 创建键值对 keys 遍历查看所有键 exists 判断一个键是否存在,1存在,0不存在 dbsize 当前数据库中有多少个键 del 删除一个或多个键 expire 设 ...

  7. python -- redis连接与使用

    前面我们简单介绍了redis nosql数据库,现在我们在python里面来使用redis. 一.python连接redis 在python中,要操作redis,目前主要是通过一个python-red ...

  8. stm32.cube介绍

    stm32.cube(一)——系统架构及目录结构 stm32.cube(二)——HAL结构及初始化 stm32.cube(三)——HAL.GPIO stm32.cube(四)——HAL.ADC stm ...

  9. es6技巧写法

    为class绑定多个值 普通写法 :class="{a: true, b: true}" 其他 :class="['btn', 'btn2', {a: true, b: ...

  10. 现代JS中的流程控制:详解Callbacks 、Promises 、Async/Await

    JavaScript经常声称是_异步_.那是什么意思?它如何影响发展?近年来这种方法有何变化? 请思考以下代码: result1 = doSomething1(); result2 = doSomet ...