Primer回顾 数组和指针
数组和指针类似于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回顾 数组和指针的更多相关文章
- c++ primer 4 数组和指针
类比的思想学习数组和指针,c++提供类似于vector和迭代器的低级复合类型——数组和指针.与vector相似,数组可以保存某一种类型的一组对象:而他们的区别在于,数组的长度固定,数组一经创建就不允许 ...
- 把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另 ...
- 【C语言学习】《C Primer Plus》第10章 数组和指针
学习总结 1.数组初始化方式: int a[]={1,2,3} int a[SIZE]={1,2,3} //SIZE是宏定义,数组初始化个数不能大于SIZE,否则报错:当个数小 //SIZE,自动补0 ...
- C++ Primer 随笔 Chapter 4 数组和指针
1.数组:数组是由类型名.标识符和维数组成的符合数据类型,类型名规定了存放在数组中的元素类型,维数规定数组中包含元素的个数而标识符就是数组的名称.例如: int arr[10]; 其中 int 是类 ...
- C Primer Plus 第10章 数组和指针 编程练习
这章感觉好难啊,放个别人的总结. // 多维数组和指针 #include <stdio.h> int main(void) { int zippo[4][2] = {{2, 4}, {6, ...
- C Primer Plus学习笔记(九)- 数组和指针
数组 数组由数据类型相同的同一系列元素组成 需要使用数组时,通过声明数组告诉编译器数组中内含多少元素和这些元素的类型 普通变量可以使用的类型,数组元素都可以用 float candy[365]; // ...
- C++ Primer高速入门之六:数组和指针
更新:勘误,delete [] 猪 我们知道,C语言以及早期的面向结构的语言差点儿都支持数组定义.比方整形数组int 女神[2].表示有俩数: 女神[0], 女神[1].她们都是整数. C++ 语言为 ...
- C++数组和指针
<C++ Primer 4th>读书摘要 与 vector 类型相似,数组也可以保存某种类型的一组对象:而它们的区别在于,数组的长度是固定的.数组一经创建,就不允许添加新的元素.指针则可以 ...
- 深入解析C语言数组和指针
概述 指针是C语言的重点,同时也是让初学者认为最难理解的部分.有人说它是C语言的灵魂,只有深入理解指针才能说理解了C语言.暂且撇开这些观点不谈.这章是我在阅读<C和指针>这本书的读书笔记. ...
随机推荐
- 九度OJ 1159:坠落的蚂蚁 (模拟、排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1098 解决:277 题目描述: 一根长度为1米的木棒上有若干只蚂蚁在爬动.它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右.如 ...
- Android学习之——优化篇(2)
一.高级优化 上篇主要从0基础优化的方式,本篇主要将从程序执行性能的角度出发,分析各种经常使用方案的不足.并给出对象池技术.基础数据类型替换法.屏蔽函数计算三种能够节省资源开销和处理器时间的优 ...
- update module (更新模块)
[转自http://blog.csdn.net/zhongguomao/article/details/6712568] function module:更新程序必须用一个特殊的FM(update m ...
- PYTHON加密解密字符串
依赖包安装部分 安装依赖包: pip install pycryptodome 在你的python环境中的下图红框路径中找到 crypto 将其改成 Crypto 代码部分 #!/usr/bin/en ...
- Maximum Subsequence Sum 【DP】
Given a sequence of K integers { N1, N2, -, NK }. A continuous subsequence is defined to be ...
- Android Weekly Notes Issue #320
Android Weekly Issue #320 July 29th, 2018 Android Weekly Issue #320 本期内容包括: Firebase的MLKit; 关于写Andro ...
- Laravel5.5执行表迁移命令出现表为空的解决方案
今天在使用一个第三方包 laravel-admin 时,出现了这样的错误:SQLSTATE[42000]: Syntax error or access violation: 1103 Incorre ...
- image auto fix the View
image: { flex: 1, width: null, height: null, resizeMode: 'contain' }
- ESP8266串口模块的基本使用【转】
本文转载自:http://www.shaoguoji.cn/2017/01/15/ESP8266-usage/ ESP8266是一款超低功耗的UART-WiFi 透传模块,拥有业内极富竞争力的封装尺寸 ...
- Protothread 机制
一.概述 很多传感器操作系统都是基于事件驱动模型的,事件驱动模型不用为每个进程都分配一个进程栈,这对内存资源受限的无线传感器网络嵌入式系统尤为重要. 然而事件驱动模型不支持阻塞等待抽象语句,因此程序员 ...