《c++ primer》学习笔记 第四章 数组与指针
2014-05-10 00:21
253 查看
《c++ primer》第四章* 数组与指针
const unsigned buff_size=50;
int int_size = 20;
const unsigned usize = getsize(); //getsize只能在运行时确定
其中,只有buff_size能作为数组的维数。int_size是变量,usize, getsize()的值都要在运行时才能确定。
数组可以在定义时直接初始化,用大括号{}括起来。如果数组元素没有提供初始值,会根据普通变量一样初始化。如int初始化为0,string初始化为””。
需要指出的是对于特殊的字符数组需要注意结束字符串‘\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)
(2) 引用始终指向同一个特定对象,所以定义时必须初始化。对引用赋值实质上是改变引用所指向对象的值。
指向const对象的指针是指不能通过指针来更改所指向对象的值。如如果函数不改变传入参数的值,则将其定义为const类型。
在调用strcat、strcpy时,调用着必须确保目标字符串有足够的大小空间,否则会产生严重错误。
为了确保安全,最好使用上述函数的安全版本:strncat, strncpy. 当然,更好的结果就是不要使用c风格的字符串,而是用c++的string。
string 类提供了一个名为 c_str 的成员函数,以实现我们的要求:
char *str = st2.c_str(); // almost ok, but not quite
c_str 函数返回 c 风格字符串,其字面意思是:“返回 c 风格字符串的表示方法”,即返回指向字符数组首地址的指针,该数组存放了与 string 对象相同的内容,并且以结束符 null 结束。
如果 c_str 返回的指针指向 const char 类型的数组,则上述初始化失败,这样做是为了避免修改该数组。正确的初始化应为:
const char *str = st2.c_str(); // ok
c_str 返回的数组并不保证一定是有效的,接下来对 st2 的操作有可能会改变 st2 的值,使刚才返回的数组失效。如果程序需要持续访问该数据,则应该复制 c_str 函数返回的数组。
int *pia = new int[10]; // array of 10 uninitialized ints
此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia。
动态内存管理中需要注意的是new出来的对象,最后都需要使用delete显式回收。
数组
数组是存储同类型数据的集合。数组的维数必须是在编译期可以确定的常量,如整型字面值常量、枚举常量或者是常量表达式中已经初始化的const对象。数组定义如下:const unsigned buff_size=50;
int int_size = 20;
const unsigned usize = getsize(); //getsize只能在运行时确定
其中,只有buff_size能作为数组的维数。int_size是变量,usize, getsize()的值都要在运行时才能确定。
数组可以在定义时直接初始化,用大括号{}括起来。如果数组元素没有提供初始值,会根据普通变量一样初始化。如int初始化为0,string初始化为””。
需要指出的是对于特殊的字符数组需要注意结束字符串‘\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的标准库函数有:在调用strcat、strcpy时,调用着必须确保目标字符串有足够的大小空间,否则会产生严重错误。
为了确保安全,最好使用上述函数的安全版本:strncat, strncpy. 当然,更好的结果就是不要使用c风格的字符串,而是用c++的string。
string 类提供了一个名为 c_str 的成员函数,以实现我们的要求:
char *str = st2.c_str(); // almost ok, but not quite
c_str 函数返回 c 风格字符串,其字面意思是:“返回 c 风格字符串的表示方法”,即返回指向字符数组首地址的指针,该数组存放了与 string 对象相同的内容,并且以结束符 null 结束。
如果 c_str 返回的指针指向 const char 类型的数组,则上述初始化失败,这样做是为了避免修改该数组。正确的初始化应为:
const char *str = st2.c_str(); // ok
c_str 返回的数组并不保证一定是有效的,接下来对 st2 的操作有可能会改变 st2 的值,使刚才返回的数组失效。如果程序需要持续访问该数据,则应该复制 c_str 函数返回的数组。
动态数组
每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区或堆。c 语言程序使用一对标准库函数malloc 和 free 在自由存储区中分配存储空间,而 c++ 语言则使用 new 和delete 表达式实现相同的功能。int *pia = new int[10]; // array of 10 uninitialized ints
此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia。
动态内存管理中需要注意的是new出来的对象,最后都需要使用delete显式回收。
相关文章推荐
- 数组和指针 - 1【C++ Primer 学习笔记 - 第四章】
- 《c++ primer》第四章--数组和指针
- C++ Primer学习笔记---第四章 数组和指针
- C++ Primer 第四章 数组和指针
- C++ primer 第四章--数组和指针
- C++ Primer 第四章 数组和指针
- C++ Primer 4 第四章 数组和指针
- C++ Primer 第四章 数组与指针
- C++ Primer 【第四版】第四章 数组和指针
- C++ Primer复习和学习笔记 第四章 数组和指针
- C++primer第四章(二):数组和指针——指针
- 第四章 []运算符的本质 [置顶] 第四章 []运算符的本质 分类: 数组与指针的艺术 2009-11-23 10:59 8972人阅读 评论(28) 收藏 举报 bufferinteger编译器o
- 第四章 数组和指针
- 第四章作业:4.17:建立一个对象数组,内放6个学生的数据(学号,成绩),用指针向数组首元素,输出第2,4,6个学生的数据。
- 《C++ Primer 4th》读书笔记 第4章-数组和指针
- C++ Primer 第四版读书笔记(三)之数组与指针
- C++ Primer 学习笔记(三)——数组和指针
- C专家编程——第四章:数组与指针并不相同
- [C++ primer 学习笔记][04]数组和指针
- [C++ 学习] C++ Primer 习题 4.36 指针数组 & 数组指针