4.2指针的引入
*符号把一个标识符声明为指针:
vector<int> *pvec; pvec是一个执行vector<int>类型对象的指针
int *ip1,*ip2; ip1和ip2分别是指向int类型对象的指针
一个有效的指针必然是以下三种状态:
1.保存一个特定对象的地址;
2.只想某个对象后面的一个对象;
3. 0值
注意:避免使用未初始化的指针,悬空指针,dangerous!!
简单的指针操作:
#include <iostream> #include<string> using namespace std; int main() { string s("hello world!"); string *ip=&s; cout<<*ip; return 0; }
解引用操作生成左值,可用来修改指针所指对象的值。
指向指针的指针:
#include <iostream> using namespace std; int main() { int val=1024; int *pi=&val; int **ppi=π cout<<val<<endl<<*pi<<endl<<**ppi<<endl; return 0; } //output 1024 1024 1024
习题4.14
//修改指针的值 #include <iostream> using namespace std; int main() { int val=10; int *ip1=&val,*ip2=0; ip2=ip1; cout<<*ip2<<endl; return 0; }
//修改指针所指对象的值 #include <iostream> using namespace std; int main() { int val=10; int *ip1=&val; *ip1=110; cout<<*ip1<<endl; return 0; }
使用指针访问数组元素
表达式中使用数组名时,改名字会自动跳转为指向数组第一个元素的指针;
int is[]={0,1,2,3,4};
int *ip=ia; //ip points to {0}
两个指针减法操作的结果是ptrdiff_t型的数据;
相减的两个指针必须是指向同一类型的;
ptrdiff_t是一种机器相关的类型,在cstddef头文件里面定义,是signed类型的哦!!与size_t不大一样,size_t是unsigned类型的。
用指针遍历数组:
#include <iostream> using namespace std; int main() { const size_t array_size=5; int arr[array_size]={0,1,2,3,4}; for(int *pbegin=arr,*pend=arr+array_size;pbegin!=pend;pbegin++) cout<<*pbegin<<' '; return 0; }
pbegin是数组的起始位置,而pend是数组的超出末端位置,相当与vector的end函数,我们不能对pend解引用,c++允许pend与其他指针比较,但不允许解引用!!未定义的操作。
习题4.18
#include <iostream> using namespace std; int main() { const size_t array_size=5; int arr[array_size]={0,1,2,3,4}; for(int *pbegin=arr,*pend=arr+array_size;pbegin!=pend;pbegin++){ *pbegin=0; cout<<*pbegin; } return 0; }
指针和const限定符
c++强制要求指向const对象的指针也必须具有const特性;
const double *cptr;
将cptr设置成指向const对象的指针,但是cptr的值可以改变,只是不可以通过cptr来改变const对象,~~~~~~cptr一经定义,就不允许修改其所指对象的值!!!
不能保证指向const的指针(自以为指向const的指针)所指对象的值一定不可修改!!!
const指针
本身的值不能修改;
int errnumb=0;
int *const curerr=&errrnumb; //cureer is a const pointer!!!!
指向const对象的const指针
const double pi=3.14159;
const double *const pi_ptr=π //pi_ptr首先是一个const指针,指向double型的const对象;
习题4.20
int i=-1; const int ic=i; const int *pic= int *const cpi= //错误!cpi是指向int型的const指针,而ic是const int型的!! //const和int const都不可以,好严格的说~~# const int *const cpic= //都是const int