[c++primer][04]数组和指针

现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针。设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。

4.1 数组

数组的维数必须用值大于等于1的常量表达式定义。非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。

初始化

如果没有显式提供元素初值,数组元素与变量初始化规则一致。

字符串字面值包含一个额外额空字符(null)用于结束字符串

const char ch[6] = “Daniel” ; //error: Daniel is 7 elements 

操作

数组下标的正确类型是size_t

4.2 指针的引入

什么是指针

指针保存的是另一个对象的地址,&操作符只能用于左值

初始化

避免使用未初始化的指针

有效的指针或者保存一个特定对象的地址,或者指向某个对象后面的另一个对象,或者是0值(0值表明指针不指向任何对象)

指针也可使用预处理器变量NULL初始化,该变量在stdlib.h中定义,其值为0

void*指针

void*可以保存任何类型对象的地址,不允许使用void*指针操纵它所指向的对象

指针和引用

引用总是指向某个对象,定义引用时没有初始化是错误的;

给引用赋值修改的是该引用所关联的对象的值,引用一经初始化,就始终指向同一特定对象

使用指针访问数组元素

数组名是指向数组第一个元素的指针

C++允许计算数组或对象的超过末端的地址,但不允许对此地址进行解引用操作。

指针和const限定符

允许把非const对象的地址赋给指向const对象的指针

不能使用指向const对象的指针修改基础对象,然后如果该指针指向的是一个非const对象,可用其它方法修改所指的对象。

指针和typedef

typedef string *pstring;
const pstring cstr; 

const pstring是string *const 类型,即指向string类型对象的const指针(因为const修饰的是pstring类型,这是一个指针)

4.3 C风格字符串

含义

即以空字符null结束的字符数组(进行strncpy操作时,注意预留结束符的存储空间)

空字符(null): ‘\0’ ascii码是0

空格(SPACE): “” ascii码是32

创建动态数组

动态分配数组时,如果数组元素具有类类型,则用该类的默认构造函数初始化,如果数组元素是内置类型,则无初始化。

int *pia = new int[10]; //array of 10 uninitialized ints
int *pia2 = new int[10](); //加上空圆括号,对数组元素做值初始化,设置为0

允许动态分配空数组

size_t n = get_size(); // get_size returns number of elements needed
int* p = new int[n];
for (int* q = p; q != p + n; ++q)
/* process the array */

char arr[0]; // error: cannot define zero-length array
char *cp = new char[0]; // ok: but cp can‘t be dereferenced

用new动态创建长度为0的数组时,new返回有效的非零指针。

新旧代码兼容

c_str()返回指向const char类型的数组,是C风格字符串。

const char *str = str.c_str(); //正确的初始化形式

数组指针可用来初始化vector对象(迭代器作用)

4.4 多维数组

基本概念

使用多维数组名时,将自动转换为指向该数组第一个元素(第一个内层数组)的指针

Because a multidimensioned array is really an array of arrays, the pointer type to which the array converts is a pointer to the first inner array. Although conceptually straightforward, the syntax for declaring such a pointer can be confusing:

int ia[3][4]; // array of size 3, each element is an array of ints of size 4
int (*ip)[4] = ia; // ip points to an array of 4 ints
ip = &ia[2]; // ia[2] is an array of 4 ints

*ip是int[4]类型,即ip是指向含有4个元素的数组的指针

用typedef简化指向多维数组的指针

typedef int int_array[4]; //把int[4]类型定义为int_array
int_array *ip = ia;

for (int_array *p = ia; p != ia + 3; ++p)
  for (int *q = *p; q != *p + 4; ++q)
    cout << *q << endl;
时间: 2024-10-13 22:26:53

[c++primer][04]数组和指针的相关文章

c++ primer 3 数组和指针

类比的思想学习数组和指针,c++提供类似于vector和迭代器的低级复合类型——数组和指针.与vector相似,数组可以保存某一种类型的一组对象:而他们的区别在于,数组的长度固定,数组一经创建就不允许添加新元素.指针则可以像迭代器一样用于遍历和检查数组中的元素 C++应尽量使用vector和迭代器类型,避免使用低级的数组和指针.设计良好的程序只有在抢到速度时才在类实现的内部使用数组和指针 4.1 数组 定义和初始化 数组的位数必须用值大于等于1的常量表达式定义,非const变量以及要到运行阶段才

《C++ Primer 4th》读书笔记 第4章-数组和指针

原创文章,转载请注明出处: http://www.cnblogs.com/DayByDay/p/3911573.html <C++ Primer 4th>读书笔记 第4章-数组和指针

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

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另一个vector,也是将一个vector 的元素逐个赋值给另一vector 的对应元素: //将一个vector 赋值给另一vector,使用迭代器访问vector 中的元素 vector<int> ivec(10, 20); vector<int> ivec1; for (vecto

C++ Primer 第四版读书笔记(三)之数组与指针

C++语言提供了两种类似于vector和迭代器类型的低级复合类型--数组与指针.与vector类型相似,数组也可以保存某种类型的一组对象:而它们的区别在于,数组的长度是固定的.数组一经创建,就不允许添加新的元素.指针则可以像迭代器一样用于遍历和检查数组中的元素. 现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针.设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针. 数组是C++语言中类似于标准库vector类型的内置数据结构.与vector类似,数组也是一种

C++ Primer快速入门之六:数组和指针

更新:勘误,delete [] 猪 我们知道,C语言以及早期的面向结构的语言几乎都支持数组定义,比如整形数组int 女神[2],表示有俩数: 女神[0], 女神[1],她们都是整数.C++ 语言为了效率和兼容考虑,也支持这个.当然了,毕竟是别人家的孩子(标准),并不提供类似于 vector 和迭代器类型那些神奇的能力.与 vector的区别在于,数组的长度是固定的.另外呢,指 针还是那个指针,没有变化. ? 我们编程时候,尽量使用 vector,避免使用数组和指针.有了vector和她的iter

C++primer第四章 数组和指针

4.1. 数组 数组是由类型名.标识符和维数组成的复合数据类型(第 2.5 节),类型名规定了存放在数组中的元素的类型,而维数则指定数组中包含的元素个数. 数组定义中的类型名可以是内置数据类型或类类型:除引用之外,数组元素的类型还可以是任意的复合类型.没有所有元素都是引用的数组. 4.1.1. 数组的定义和初始化 数组的维数必须用值大于等于 1 的常量表达式定义(第 2.7 节). 此常量表达式只能包含整型字面值常量.枚举常量(第 2.7 节)或者用常量表达式初始化的整型 const 对象. /

《C++ Primer》学习 之 返回数组的引用(返回数组的指针,方法与之相同)

/* 返回数组的引用(返回数组的指针,方法与之相同) 共四种方法(在下面示例程序中,调用其中一种方法时,需要将其他三种方法注释掉)*/ 1 #define _CRT_SECURE_NO_WARNINGS 2 #define HOME 3 #include <iostream> 4 #include <stdexcept> 5 #include <ctype.h> 6 #include <locale> 7 #include <iterator>

C Primer Plus (第五版) 第十章 数组和指针 编程练习

第十章 数组和指针 编程练习 1.修改程序清单10.7中的程序rain,使它不使用数组下标,而是使用指针进行计算(程序中仍然需要声明并初始化数组). # include <stdio.h> # define MONTHS 12 # define YEARS 5 int main(void) { //把数组初始化为2000年到2004年的降水量数据 const float rain[YEARS][MONTHS] = { { 4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0

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

更新:勘误,delete [] 猪 我们知道,C语言以及早期的面向结构的语言差点儿都支持数组定义.比方整形数组int 女神[2].表示有俩数: 女神[0], 女神[1].她们都是整数. C++ 语言为了效率和兼容考虑,也支持这个. 当然了,毕竟是别人家的孩子(标准).并不提供类似于 vector 和迭代器类型那些奇妙的能力.与 vector的差别在于.数组的长度是固定的.另外呢,指 针还是那个指针,没有变化. ? 我们编程时候.尽量使用 vector,避免使用数组和指针.有了vector和她的i