《c++ primer》学习笔记 第四章 数组与指针

来源:互联网 发布:储存卡损坏数据恢复 编辑:程序博客网 时间:2024/05/17 09:19

c++ primer》第四章* 数组与指针


数组

数组是存储同类型数据的集合。数组的维数必须是在编译期可以确定的常量,如整型字面值常量、枚举常量或者是常量表达式中已经初始化的const对象。数组定义如下:

const unsigned buff_size=50;

int int_size = 20;

const unsigned usize = getsize(); //getsize只能在运行时确定

其中,只有buff_size能作为数组的维数。int_size是变量,usize, getsize()的值都要在运行时才能确定。

数组可以在定义时直接初始化,用大括号{}括起来。如果数组元素没有提供初始值,会根据普通变量一样初始化。如int初始化为0string初始化为””。

需要指出的是对于特殊的字符数组需要注意结束字符串‘\0’的存在。如:

char ch[]={‘c’,’+’,’+’}; //没有结束符

char ch[]={‘c’,’+’,’+’,’\0’}; //显示加上结束符

char ch[]=”c++”; //自动加上结束符

c语言中,‘\0’是一个很重要的标志,用来确定数据边界。

指针与数组

指针用来指向对象,具体来说,指针保存的是一个对象的地址。

string s = “c++”;

string *ps = &s;

ps便是一个指向string对象的指针,ps指向的便是s的地址。

指针用来遍历数组,对数组的操作均可由指针来完成。

 

建议:(1)尽量避免使用指针与数组,取而代之的使用容器及迭代器。

(2)避免使用未初始化的指针!很多运行时错误都源于使用了未初始化的指针。

 

void* 指针

c++提供void*指针,它可以指向任何对象。void*指针表明该指针与某一地址值相关,但不清楚该对象上的类型。

 

关键概念:给指针赋值或通过指针进行赋值

给指针赋值是对指针本身进行的修改,意识是改变了指针的指向;而通过指针赋值则是对指针指向的对象进行更改。如:string s1(“some value”);

string *sp1=&s1;

 

string s2(“other value”);

string *sp2 = &s2;

 

*sp1 = “change value”; //通过指针进行赋值,将sp1指向的地址值由原来的some value改为change value

 

sp1 = sp2; //给指针赋值,更改sp1指向的地址,将sp1指向s2(other value)

指针与引用的区别

(1) 引用总是指向一个对象,且在定义时必须初始化,而指针不然。

(2) 引用始终指向同一个特定对象,所以定义时必须初始化。对引用赋值实质上是改变引用所指向对象的值。

const指针和指向const对象的指针

const指针是指指针对象本身不能改变,即一旦将是指针指向某一地址后就不能更改,因此很少用。

指向const对象的指针是指不能通过指针来更改所指向对象的值。如如果函数不改变传入参数的值,则将其定义为const类型。

 

cstring c风格的字符串

使用c风格的字符串时千万不要忘记结尾的null字符‘\0’。常用的操作从cstring的标准库函数有:

         

在调用strcatstrcpy时,调用着必须确保目标字符串有足够的大小空间,否则会产生严重错误。

为了确保安全,最好使用上述函数的安全版本:strncat, strncpy. 当然,更好的结果就是不要使用c风格的字符串,而是用c++string

 

string 类提供了一个名为 c_str 的成员函数,以实现我们的要求:

char *str = st2.c_str(); // almost ok, but not quite

c_str 函数返回 风格字符串,其字面意思是:“返回 风格字符串的表示方法”,即返回指向字符数组首地址的指针,该数组存放了与 string 对象相同的内容,并且以结束符 null 结束。

如果 c_str 返回的指针指向 const char 类型的数组,则上述初始化失败,这样做是为了避免修改该数组。正确的初始化应为:

const char *str = st2.c_str(); // ok

c_str 返回的数组并不保证一定是有效的,接下来对 st2 的操作有可能会改变 st2 的值,使刚才返回的数组失效。如果程序需要持续访问该数据,则应该复制 c_str 函数返回的数组。

动态数组

每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区或堆。语言程序使用一对标准库函数malloc 和 free 在自由存储区中分配存储空间,而 c++ 语言则使用 new delete 表达式实现相同的功能。

int *pia = new int[10]; // array of 10 uninitialized ints

此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia

动态内存管理中需要注意的是new出来的对象,最后都需要使用delete显式回收。

 

 

 

0 0
原创粉丝点击