您的位置:首页 > 编程语言 > C语言/C++

C++第十天

2014-07-22 15:32 197 查看
指针:指针是指向某种类型对象的复合数据类型,或者称指针就是存放对象的地址。
访问指针的值:使用解引用操作符 * 和自增操作符++,与在迭代器上的用法类似。
取址操作符:&操作符,获取一个变量的地址。

指针的定义和初始化:
C++语言使用*符号把一个标识符声明为指针,例如:
//声明指针的风格之一
vector<int> *pevec;
int *ip1,*ip2;
//声明指针的风格之二
string* str;  //str为指针
建议使用声明指针的风格一,因为风格二连续声明指针容易导致混淆,例如:
string* ps1,ps2;      //ps1为指针,ps2为变量
string* ps1,*ps2;		//ps1和ps2都为指针。

指针的可能的取值:
1.保存一个特定对象的地址
2.指向某个对象后面的另一个对象
3.0值,表明不指向任何对象。
(为初始化的指针是无效的,直到该指针赋值后,才可使用它。)

避免使用未初始化的指针,除非所指向的对象已经存在,否则不要先定义指针,这样可以避免定义一个未初始化的指针。
如果必须分开定义指针和其所指向的对象,则将指针初始化为0,因为编译器可检查出0值的指针,程序可判断指针并未指向一个对象。

void* 指针:
void*指针可以保存任何类型的对象的地址。
不允许使用void*指针操纵它所指向的对象。
不能使用void*指针保存const对象的地址,而必须使用const void*类型的指针保存const对象的地址

修改指针的值和修改指针指向对象的值
修改指针所指向对象的值:需要解引操作。
*sp="goodbye";
修改指针的值:给指针直接赋值即可修改指针的值
string s2="some value";
sp=&s2;

指针和引用的比较:
引用总是指向某个对象,定义引用时没有初始化时错误的。
引用已经初始化,就始终指向同一个特定对象。
给引用赋值修噶ide是该引用所关联的对象的值,而并不是使引用于另一个对象关联。
例如:
int &ri=ival,&ri2=ival2;
ri=ri2;
这个赋值操作修改了ri应用的值ival对象,而并非引用本身,赋值后,这两个引用还是分别指向原来关联的对象,此时两个对象的值相等

指向指针的指针:
int ival=11;
int *pi=&ival;
int **ppi=π  //指向指针的指针。

指针的操作:
两个指针相见的结果是标准库类型的ptrdiff_t的数据,ptrdiff_t在cstddef头文件中定义。
指针的自增操作时指向下一个对象的地址,指针的自减操作时指向上一个对象的地址

使用指针遍历数组:
const size_t arra_sz=5;
int int_arr[arra_sz]={0,1,2,3,4};
for(int *pbegin=int_arr,*pend=int_arr+arra_sz;pbegin!=pend;++begin){
cout << * pbegin<<'';
}

指向const对象的指针和const指针:
指向const对象的指针也必须具有const特性,例如:
const double *cptr;  //指向const对象的指针,允许cptr重新赋值,不能修改指向对象的值,因为指向的对象是const对象
const指针:
int eNum=0;
int *const curErr=&eNum;   //const指针,不能修改指针的值,也就是不能指向其他的对象,可以修改指针指向的对象的值
(const指针也可以指向const对象,即指向指针的值不能修改,也不能修改指针的值)

指针和typedef
typedef string *pstring;
const pstring cstr;//指向string类型的const指针
等价于:string *const cstr;
声明const pstring时,const修饰的是pstring的类型,这是一个指针,该声明语句应该是把cstr定义为指向string类型对象的const指针。

#include<iostream>
using std::cout;
using std::cin;
using std::endl;
int main(){
/*
int ival=1024;
int *pi;//=&ival;
cout<<ival<<"\n"<<*pi<<endl;
*/
int i=-1;
const int ic=1;
// const int *pic=⁣
i=ic;
//指向const对象的const指针
const int *const cpi=⁣
//int *const ccc=cpi;
//ic=*cpi;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: