Part6 数组、指针与字符串 6.5指针的定义和运算

1 指针的概念、定义和指针运算
内存空间的访问形式:
  1 通过变量名访问
  2 通过地址访问

指针的概念:
  指针:内存地址,用于间接访问内存单元
  指针变量:用于存放地址的变量

 


2 指针的初始化和赋值
指针变量的初始化:
  存储类型 数据类型 *指针名=初始地址;

注意事项:
  1 用变量地址作为初值时,该变量必须在指针初始化之前已声明过,且变量类型应与指针类型一致。
  2 可以用一个已有合法值的指针去初始化另一个指针变量。
  3 不要用一个内部非静态变量去初始化 static 指针。


指针变量的赋值运算:
  指针名=地址
向指针变量赋的值必须是地址常量或变量,不能是普通整数,例如:
  1 通过地址运算“&”求得已定义的变量和对象的起始地址
  2 动态内存分配成功时返回的地址
例外:整数0可以赋给指针,表示空指针。
允许定义或声明指向 void 类型的指针。该指针可以被赋予任何类型对象的地址。
  例: void *general;

C++11 使用nullptr关键字,是表达更准确,类型安全的空指针

//6-5 指针的定义、赋值与使用
#include<iostream>
using namespace std;
int main(){
    int i;
    int *ptr = &i;
    i = 10;
    cout << "i = " << i << endl;
    cout << "*ptr = " << *ptr << endl;
    return 0;
}
//6-6 void类型指针的使用
#include<iostream>
using namespace std;
int main(){
    void *pv;
    int i = 5;
    pv = &i;
    int *pint = static_cast<int*>(pv);//void指针转换为int指针
    cout << "*pint = " << *pint << endl;
    return 0;
}

 

指向常量的指针:不能通过指向常量的指针改变所指对象的值,但指针本身可以改变,可以指向另外的对象。

int a;
const int *p1 = &a; //p1是指向常量的指针,相当于一个只读指针
int b;
p1 = &b; //正确,p1本身的值可以改变
*p1 = 1; //编译时出错,不能通过p1改变所指的对象

指针常量:指针本身的值不能被改变。

int a;
int * const p2 = &a;
p2 = &b; //错误,p2是指针常量,值不能改变

 


3 指针的算术运算、关系运算
指针类型的算术运算:
  指针p加上或减去n:其意义是指针当前指向位置的前方或后方第n个数据的起始位置。
  指针的++、--运算:意义是指向下一个或前一个完整数据的起始。
运算的结果值取决于指针指向的数据类型,总是指向一个完整数据的起始位置。
当指针指向连续存储的同类型数据时,指针与整数的加减运和自增自减算才有意义。

 

指针类型的关系运算:
  指向相同类型数据的指针之间可以进行各种关系运算。
  指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。
  指针可以和零之间进行等于或不等于的关系运算。
    例如:p==0 或p!=0

 

posted @ 2017-12-05 18:50  LeoSirius  阅读(145)  评论(0编辑  收藏  举报