`
oolala
  • 浏览: 99943 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
09c341db-7f05-3f2b-a572-9ee69a5d8a77
unix环境高级编程
浏览量:21718
社区版块
存档分类
最新评论

c++ primer 4 数组和指针

    博客分类:
  • c++
阅读更多
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第四版【中文高清扫描版】.pdf

    【原书名】 C++ Primer (4th Edition) 【原出版社】 Addison Wesley/Pearson 【作者】 (美)Stanley B.Lippman,Josée LaJoie,Barbara E.Moo 【译者】 李师贤 蒋爱军 梅晓勇 林瑛 【丛书名】 图灵计算机科学丛书 ...

    C++primer 课后题答案

    C++primer 课后题答案 目录 第一章 快速入门 2 第二章 变量和基本类型 7 第三章 标准库类型 13 第四章 数组和指针 21 第五章 表达式 31 第六章 语句 37 第七章 函数 37 第八章 标准IO库 37 第九章 顺序容器 43 第十...

    非常经典的c++ primer视频教程6-10

    第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限定符 ...

    C++Primer视频(初级)下载地址

    第4章指针和const限定符 33.第4章C风格字符串 34.第4章创建动态数组 35.第4章新旧代码的兼容 36.第4章多维数 37.第5章算术操作符 38.第5章关系操作符和逻辑操作符 39.第5章位操作符 40.第5章赋值...

    C++ primer 第4版 原书+习题解答+源码 清晰pdf

     第4章 数组和指针  4.1 数组  4.2 指针的引入  4.3 C风格字符串  4.4 多维数组  小结  术语  第5章 表达式  5.1 算术操作符  5.2 关系操作符和逻辑操作符  5.3 位操作符  5.4 赋值操作符 ...

    C++Primer Plus学习笔记(三)

    C++ primer plus学习笔记之三,分为一下几个部分: 函数参数:介绍了函数的生命规则以及定义 数组函数:数组作为变量时的使用方法 指针和const:灵活运用指针和const 函数和二维数组:二维数组作为变量时声明以及定义...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     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++ Primer Plus学习(一)

    简单的C++入门代码,包括 整形 Std输出 浮点数 数组 字符串 结构 指针 new动态结构 for循环 std的cin相关 循环 博客地址:http://blog.csdn.net/zmdsjtu/article/details/52381417

    C++Primer中文版(第4版).part4

     第4章 数组和指针  4.1 数组  4.2 指针的引入  4.3 C风格字符串  4.4 多维数组  小结  术语  第5章 表达式  5.1 算术操作符  5.2 关系操作符和逻辑操作符  5.3 位操作符  5.4 赋值操作符 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     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++ primer 第5版(李普曼) part3

    很多教材不使用标准库,而是使用基于字符数组指针和动态内存管理的低级程序设计技术。让使用这种低级技术的程序正确运行,要比编写相应的使用标准库的C++代码困难得多。  贯穿全书,我们都在强调好的风格:我们想...

    C++ Primer笔记

    基本语法 标准库string类型 标准库vector类型 ...数组和指针 异常机制 函数 标准IO库 容器和算法 关联容器 泛型算法 类和数据抽象 复制控制 重载操作符与转换 面向对象编程 模版与泛型编程

    《C++ primer plus》读书笔记(一)

    头文件没有.h前缀时,类、函数和变量是C++编译器的标准组件,被放置在名称空间std中。 3、类的本质——类是用户定义的一种数据类型。类定义描述的是数据格式及其用法,而对象则是根据数据格式规范创建的实体。 4、...

    java坑爹的笔试题-cpp-primer-5th:C++Primer第五版学习资料

    C++Primer第五版——习题答案+详解(完整版) 作者学习心得 2017年3月23日更新:历时三个月,粗略的算是看完了这本书,简单的进行总结一下: 本书的Part I(C++基础)是C++基础,必须进行通读掌握。这几章有非常多的小...

    C++Primer Plus学习笔记(六)

    类Class的用法 类的构造函数和析构函数 const成员函数 this指针 对象数组

    [C++ Primer中文版(第4版)].习题解答(1-18章完整版)

    13 第四章 数组和指针 ............................................................................................................................................... 21 第五章 表达式 ....................

    程序员面试刷题的书哪个好-CPP_Learning:记录下C++语言学习

    标准模版库,vector是动态数组/向量,list是双向链表。都是顺序容器。 C++多态,虚函数机制 基础:继承关系,有虚函数,父类指针指向子类。虚函数表 进程通信 进程线程差异 进程是最小的资源分配单位,线程是最小的...

    Linux多线程服务端编程:使用muduo C++网络库

    第4章C++ 多线程系统编程精要83 4.1基本线程原语的选用. . . . . . . . . . . . . . . . .. . . . . . . . . . . . 84 4.2C/C++ 系统库的线程安全性. . . . . . . . . . . . . . . . .. . . . . . . . 85 4.3Linux ...

    学编程的步骤.txt

    10:要想学好VC,没有扎实的C++知识是不行的,以下书籍是VC程序员必须翻的烂熟的:C++Primer,Effective C++,Thinking in C++,More Effective C++ 深入浅出MFC。 11:深刻理解C++面向对象的思想! 12:编程的...

Global site tag (gtag.js) - Google Analytics