1 数组
显式初始化数组
int ia[3] = {1,2,3};
如果没有显式提供元素初值,则数组元素会像普通变量一样初始化
a)如果函数体外定义的内置数组,其元素均初始化为0
b)在函数体内定义的内置数组,其元素无初始化
不允许数组直接复制和赋值
数组操作
a)数组下标类型是size_t
2 指针
指针概念:指针用于指向对象。与迭代器一样,指针提供对其所指对象的间接访问,只是指针结构更通用
指针保存的是另一个对象的地址:
string s("hello word");
string *sp = &s;
定义 了一个指向stirng类型的指针sp,并初始化sp使其指向string类型的对象s
*sp 中的*操作符表明sp是一个指针变量,&s中的&符号是取地址操作符,当此操作符用于一个对象上,返回的是该对象的存储地址。
指针的定义和初始化
1)对象变量的定义
vector<int> *pvec;
int * ip1,ip2;
string * pstring;
double *dp;
理解指针声明语句时,请从右向左阅读
string *psring
把pstring定义为一个指向string类型对象的指针变量
指针的可取值
一个有效的指针必须是以下三种状态:
保存一个特定对象的地址
指向某个对象的另一个对象
0值
int *pi = 0;
避免使用未初始化的指针
建议程序员在使用之前初始化所有变量,尤其是指针
void*指针
C++提供了一种特殊的指针类型void* 它可以保存任何类型对象的地址
void*表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型
4.2.3指针操作
对指针进行解引用可访问它所指的对象,*操作符(解引用操作符)将获取指针所指的对象
int main()
{
int a = 10;
int *p = &a;
cout << *p <<endl;
cout << *p + 1 <<endl;
return 0;
}
|
1 生成左值的解引用操作
解引用操作符返回指定对象的左值,利用这个功能可修改指针所指对象的值
string s = "good";
string s2 = "nice";
string *sp = &s;
sp = &s2;
cout << *sp <<endl;
|
关键概念:给指针赋值或通过指针进行赋值
如果对左操作数进行解引用,则修改的是指针所指对象的值
如果没有使用解引用操作,则修改的是指针本身的值。
4.2.4使用指针访问数组元素
C++语言中,指针和数组密切相关。特别是在表达式中使用数组名时,该名字会自动转换为指向数组第一个元素的指针
int ai[] = {0,2,4,6,8}
int *ip = ia;
4.3 C网络字符串
字符串字面值的类型是字符常量的数组
字符串字面值的类型就是const char 类型数组
C风格字符串是以空字符null结束的字符数组
1C网络字符串的使用
C++语言通过(const)char *类型的指针来操纵C网络的字符串
一般来说,我们使用指针的算术操作来遍历C网络字符串,每次对指针进行测试并递增1,直到到达结束符null为止:
int main(void)
{
const char *p = "hello point";
while(*p)
{
cout << *p <<endl;
p++;
}
return 0;
}
|
2 C网络字符串的标准库函数
#include <cstring>
cstring是string.h头文件的C++版本
int main(void)
{
const char *a = "this is a good man";
const char *b = "my name is C++";
int i = strcmp(a,b);
cout << i <<endl;
cout << strlen(a) << endl;
return 0;
}
|
3 在使用处理c网络字符串的标准库函数时,牢记字符串必须以结束符null结束
4 传递给标准库函数strcat strcpy的第一个实参数组必须具有足够大的空间存放新生成的字符串
5 如果必须使用C网络字符串,则使用标准库函数strncat 和strncpy比strcat和strcpy更安全
6 尽可能使用标准库类型string
4.3.1创建动态数组
动态分配的数组将一直存在,直到程序显式释放它为止
1动态数组的定义
int *pia = new int[10];
2 初始化动态分配的数组
string *psa = new string[10];
int *pia = new int [10];
分配了存储10个int对象的内存空间,但这些元素没有初始化
int *pia2 = new int[10]();
圆括号要求编译器对数组做值初始化,在本例中即把数组元素都设置为0
4 允许动态分配空数组
之所以要动态分配数组,是由于编译时不知道数组长度
5 动态空间释放
delete [] pia;
6 动态数组的使用
通常是因为在编译时无法知道数组的维数,所以才需要动态创建数组。
习题4.28
从标准输入设置读入的元素数据建立一个int型vector对象,然后动态创建一个与该vector对象大小一致的数组
把vecotr对象所有元素复制给新数组
#include <iostream>
#include <string>
#include <vector>
using namespace std;
using std::vector;
using std::string;
int main()
{
vector<int> ivec;
int ival;
cout << "ctrl+z end input" << endl;
while(cin >> ival)
{
ivec.push_back(ival);
}
//动态创建数组
int *pia = new int[ivec.size()];
//复制元素
int *tp = pia;
for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end();++iter,++tp)
{
*tp = *iter;
cout << *tp << endl;
}
delete [] pia;
return 0;
}
|
习题 4.30
编写程序连接二个C风格字符串字面值,把结果存储在一个C风格字符串中。
int main()
{
const char *s1 = "c++ primer";
const char *s2 = "apple";
size_t len = strlen(s1) + strlen(s2);
char *result_str = new char[len + 1];
strcpy(result_str,s1);
strcat(result_str,s2);
cout << result_str <<endl;
delete result_str;
return 0;
}
|
相关推荐
【原书名】 C++ Primer (4th Edition) 【原出版社】 Addison Wesley/Pearson 【作者】 (美)Stanley B.Lippman,Josée LaJoie,Barbara E.Moo 【译者】 李师贤 蒋爱军 梅晓勇 林瑛 【丛书名】 图灵计算机科学丛书 ...
C++primer 课后题答案 目录 第一章 快速入门 2 第二章 变量和基本类型 7 第三章 标准库类型 13 第四章 数组和指针 21 第五章 表达式 31 第六章 语句 37 第七章 函数 37 第八章 标准IO库 37 第九章 顺序容器 43 第十...
第4章 数组和指针 4.1 数组 4.1.1 数组的定义和初始化 4.1.2 数组操作 4.2 指针的引入 4.2.1 什么是指针 4.2.2 指针的定义和初始化 4.2.3 指针操作 4.2.4 使用指针访问数组元素 4.2.5 指针和const限定符 ...
第4章指针和const限定符 33.第4章C风格字符串 34.第4章创建动态数组 35.第4章新旧代码的兼容 36.第4章多维数 37.第5章算术操作符 38.第5章关系操作符和逻辑操作符 39.第5章位操作符 40.第5章赋值...
第4章 数组和指针 4.1 数组 4.2 指针的引入 4.3 C风格字符串 4.4 多维数组 小结 术语 第5章 表达式 5.1 算术操作符 5.2 关系操作符和逻辑操作符 5.3 位操作符 5.4 赋值操作符 ...
C++ primer plus学习笔记之三,分为一下几个部分: 函数参数:介绍了函数的生命规则以及定义 数组函数:数组作为变量时的使用方法 指针和const:灵活运用指针和const 函数和二维数组:二维数组作为变量时声明以及定义...
6.3.3 返回数组指针 205 6.4 函数重载 206 6.4.1 重载与作用域 210 6.5 特殊用途语言特性 211 6.5.1 默认实参 211 6.5.2 内联函数和constexpr函数 213 6.5.3 调试帮助 215 6.6 函数匹配 217 6.6.1...
简单的C++入门代码,包括 整形 Std输出 浮点数 数组 字符串 结构 指针 new动态结构 for循环 std的cin相关 循环 博客地址:http://blog.csdn.net/zmdsjtu/article/details/52381417
第4章 数组和指针 4.1 数组 4.2 指针的引入 4.3 C风格字符串 4.4 多维数组 小结 术语 第5章 表达式 5.1 算术操作符 5.2 关系操作符和逻辑操作符 5.3 位操作符 5.4 赋值操作符 ...
6.3.3 返回数组指针 205 6.4 函数重载 206 6.4.1 重载与作用域 210 6.5 特殊用途语言特性 211 6.5.1 默认实参 211 6.5.2 内联函数和constexpr函数 213 6.5.3 调试帮助 215 6.6 函数匹配 217 6.6.1...
很多教材不使用标准库,而是使用基于字符数组指针和动态内存管理的低级程序设计技术。让使用这种低级技术的程序正确运行,要比编写相应的使用标准库的C++代码困难得多。 贯穿全书,我们都在强调好的风格:我们想...
基本语法 标准库string类型 标准库vector类型 ...数组和指针 异常机制 函数 标准IO库 容器和算法 关联容器 泛型算法 类和数据抽象 复制控制 重载操作符与转换 面向对象编程 模版与泛型编程
头文件没有.h前缀时,类、函数和变量是C++编译器的标准组件,被放置在名称空间std中。 3、类的本质——类是用户定义的一种数据类型。类定义描述的是数据格式及其用法,而对象则是根据数据格式规范创建的实体。 4、...
C++Primer第五版——习题答案+详解(完整版) 作者学习心得 2017年3月23日更新:历时三个月,粗略的算是看完了这本书,简单的进行总结一下: 本书的Part I(C++基础)是C++基础,必须进行通读掌握。这几章有非常多的小...
类Class的用法 类的构造函数和析构函数 const成员函数 this指针 对象数组
13 第四章 数组和指针 ............................................................................................................................................... 21 第五章 表达式 ....................
标准模版库,vector是动态数组/向量,list是双向链表。都是顺序容器。 C++多态,虚函数机制 基础:继承关系,有虚函数,父类指针指向子类。虚函数表 进程通信 进程线程差异 进程是最小的资源分配单位,线程是最小的...
第4章C++ 多线程系统编程精要83 4.1基本线程原语的选用. . . . . . . . . . . . . . . . .. . . . . . . . . . . . 84 4.2C/C++ 系统库的线程安全性. . . . . . . . . . . . . . . . .. . . . . . . . 85 4.3Linux ...
10:要想学好VC,没有扎实的C++知识是不行的,以下书籍是VC程序员必须翻的烂熟的:C++Primer,Effective C++,Thinking in C++,More Effective C++ 深入浅出MFC。 11:深刻理解C++面向对象的思想! 12:编程的...