C++系列笔记(二)

简介: C++系列笔记(二)

 【导读】《21天学通C++》这本书通过大量精小短悍的程序详细而全面的阐述了C++的基本概念和技术,包括管理输入/输出、循环和数组、面向对象编程、模板、使用标准模板库以及创建C++应用程序等。这些内容被组织成结构合理、联系紧密的章节,每章都可在1小时内阅读完毕,都提供了示例程序清单,并辅以示例输出和代码分析,以阐述该章介绍的主题。 本文是系列笔记的第二篇,欢迎各位阅读指正!  

指针

指针是一种指向内存单元的特殊变量。声明指针如下:

int *pInteger = NULL;    #初始化指针

使用引用运算符(&)获取变量的地址 可以声明一个int指针来储存变量的地址:

int* pInteger = &age

可将不同的内存地址赋给同一个指针变量,让它指向不同的值,如下个程序:

#include<iostream>usingnamespacestd;
intmain()
{
intage=30;
int*pInteger=&age;
cout<<"pInteger points to Age now"<<endl;
cout<<"pInteger=0x"<<hex<<pInteger<<endl;
intdogsage=9;
pInteger=&dogsage;
cout<<"pInteger dogsage=0x"<<hex<<pInteger<<endl;
return0;
}

使用解除引用运算符(星号)访问指向的数据,如:

*pInteger  #访问数据

将sizeof()用于指针时,结果与指针指向的变量类型无关,而是取决于使用的编译器和针对的操作系统。

动态内存分配

使用new来动态的分配新的内存块。如果成功,new将返回指向一个指针,指向分配的内存;需要指定要为哪种数据类型分配内存。

Type* Pointer = new Type;   #Type为类型

还可以指定为多少个元素分配内存

Type* Pointer = new Type[NumElements]例如:int* Pointer = new int[10];使用new分配的内存最终都需要使用对应的delete进行释放

delete Pointer;

delete[] Pointer

PS: delete只能释放new创建的内存,而不是用于包含任何地址的内存。

将指针递增或递减时,其包含的地址将增加或减少指向的数据类型的sizeof(并不一定是1字节)。这样,编译器将确保指针不会指向数据的中间或末尾,而只会指向数据的开头。如下:

Type* pType = Address;

则执行++PType后,PType将包含指向Address+sizeof(Type)

示例代码如下

#include<iostream>usingnamespacestd;
intmain()
{
cout<<"how many integers you wish to enter?";
intInputNums=0;
cin>>InputNums;
int*pNumbers=newint[InputNums];
int*pCopy=pNumbers;   //保存了该地址的拷贝cout<<"sucessfully allocated memory for"<<InputNums<<"integers"<<endl;for (intIndex=0; Index<InputNums; ++Index)
        {
cout<<"enter number"<<Index<<":";
cin>>*(pNumbers+Index);
        }
cout<<"displaying all numbers input:"<<endl;
for (intIndex=0, int*pCopy=pNumbers; Index<InputNums; ++Index)
        {
cout<<*(pCopy++) <<":"<<endl;
        }
delete[] pNumbers;
return0;
}

将关键字const用于指针

const指针有如下三种:

①指针指向的数据为常量,不能修改,但可以修改指针的地址,即指针可以指向其它地方

intHoursInDay=24;
constint*pInteger=&HoursInDay

②指针包含的地址是常量,不能修改,但可以修改指针指向的数据

intHoursInDay=24;
int*constpInteger=&HoursInDay

③指针包含的地址及它指向的值都是常量,不能修改

int  HoursInDay  = 24;const int* const pInteger = & HoursInDay

务必初始化指针变量,如果不能将指针初始化为new返回的有效地址或它有效变量,可将其初始化为NULL。

检查使用new发出的分配请求是否得到满足

C++提供了两种确保指针有效的方法,默认方法是使用异常,即如果内存分配失败,将引发std::bad_alloc异常。这将导致应用程序中断执行。异常处理有以下两种方法:

//第一种#include<iostream>usingnamespacestd;
intmain()
{
try        {
int*pAge=newint[5368709111];
delete[] pAge;
        }
catch (bad_alloc)
        {
cout<<"memory failed.ending program"<<endl;
        }
return0;
}
//第二种#include<iostream>usingnamespacestd;
intmain()
{
int*pAge=new(nothrow) int[0x1fffffff];
if (pAge)
        {
delete[] pAge;
        }
elsecout<<"memory allocation failed"<<endl;
return0;
}
相关文章
|
5月前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
5月前
|
编译器 C++
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
|
3月前
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
25 1
|
3月前
|
存储 安全 程序员
【C/C++笔记】迭代器范围
【C/C++笔记】迭代器范围
65 0
|
4月前
|
C++ Windows
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
在Windows上使用Visual Studio 2022进行FFmpeg和SDL2集成开发,首先安装FFmpeg至E:\msys64\usr\local\ffmpeg,然后新建C++控制台项目。在项目属性中,添加FFmpeg和SDL2的头文件及库文件目录。接着配置链接器的附加依赖项,包括多个FFmpeg及SDL2的lib文件。在代码中引入FFmpeg的`av_log`函数输出"Hello World",编译并运行,若看到"Hello World",即表示集成成功。详细步骤可参考《FFmpeg开发实战:从零基础到短视频上线》。
150 0
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
|
6月前
|
存储 C++ 容器
黑马c++ STL部分 笔记(7) list容器
黑马c++ STL部分 笔记(7) list容器
|
6月前
|
算法 C++ 容器
黑马c++ STL常用算法 笔记(5) 常用算术生成算法
黑马c++ STL常用算法 笔记(5) 常用算术生成算法
|
6月前
|
算法 C++ 容器
黑马c++ STL常用算法 笔记(4) 常用拷贝和替换算法
黑马c++ STL常用算法 笔记(4) 常用拷贝和替换算法
|
6月前
|
存储 算法 搜索推荐
黑马c++ STL常用算法 笔记(3) 排序算法
黑马c++ STL常用算法 笔记(3) 排序算法
|
6月前
|
算法 C++
黑马c++ STL常用算法 笔记(2) 查找算法
黑马c++ STL常用算法 笔记(2) 查找算法