c++primer学习笔记(4.2)指针的引入

4.2指针的引入


*符号把一个标识符声明为指针:


vector<int> *pvec;   pvec是一个执行vector<int>类型对象的指针

int *ip1,*ip2;   ip1ip2分别是指向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_tunsigned类型的。


用指针遍历数组:

#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是数组的超出末端位置,相当与vectorend函数,我们不能对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


你可能感兴趣的:(C++,c,String,vector)