C++基础(8) —— 指针的概念、定义和运算

内存空间的访问方式

  • 通过变量名访问;
  • 通过地址访问。

指针的概念

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

指针变量的定义

//例 
static int i;
static int*ptr = &i;    //ptr为指向int变量的指针
*ptr = 3;    //指针变量的使用,i赋值为3

与地址相关的运算 —— “*” 和 “&”

  • 指针运算符:*
  • 地址运算符:&

指针变量的初始化

  • 语法形式: *存储类型 数据类型 指针名 = 初始地址;

    例:int *pa = &a;

  • 注意事项:

    用变量地址作为初值时,该变量必须在指针初始化之前已声明过,且变量类型应与指针类型一致

    可以用一个已有合法值的指针去初始化另一个指针变量;

    不要用一个内部非静态变量去初始化static指针。

指针变量的赋值运算

  • 语法形式: 指针名 = 地址

  • “地址”中存放的数据类型与指针类型必须相符;

  • 向指针变量赋的值必须是地址常量或变量,不能是普通整数;

    例如,通过地址运算&求得已定义的变量和对象的起始地址,动态内存分配成功时返回的地址。

    例外,整数0可以赋给指针,表示空指针。

  • 允许定义或声明指向void类型的指针。该指针可以被赋予任何类型对象的地址。例 void *genneral;

指针空值nullptr

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

指向常量的指针 const指针

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

指针类型的常量

若声明指针常量,则指针本身的值不能被改变。

//指针的定义、赋值和使用
#include<iostream>
using namespace std;
int main(){
    int i;
    int *ptr = &i;  //取i的地址赋给指针ptr
    i = 10;
    cout << "i = " << i << endl;
    cout << "*ptr = " << *ptr << endl;  //输出int型指针ptr所指地址的内容
    return 0;
}
//运行结果:
i = 10
*ptr = 10
    
//void类型指针的使用
#include<iostream>
using namespace std;
int main(){
    //!void voidObject; 错,不能声明void类型的变量
    void *pv;  //对,可以声明void类型的指针
    int i = 5;
    pv = &i;  //void类型指针指向整型变量
    int *pint = static_cast<int*>(pv);  //void指针转换为int指针
    cout << "*pint = " << *pint << endl;
    return 0;
}
//运行结果:
*pint = 5
    
//指向常量的指针
int a;
const int *p1 = &a;  //p1是指向常量的指针
int b;
p1 = &b;  //正确,p1本身的值可以改变
*p1 = 1;  //错误,不能通过p1改变所指的对象

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

指针的算术运算

包括指针与整数的加减运算;指针++,–运算。

  • 指针p加上或者减去n

    意义是指针当前指向位置的前方或后方第n个数据的起始位置。

  • 指针的++、–运算

    意义是指向下一个或前一个完整数据的起始。

  • 运算的结果取决于指针指向的数据类型,总是指向一个完整数据的起始位置。

  • 当指针指向连续存储的同类型数据时,指针与整数的加减运算和自增自减运算才有意义。

指针类型的关系运算

  • 指向相同类型数据的指针之间可以进行各种关系运算;
  • 指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是毫无意义的;
  • 指针可以和零之间进行 等于或者不等于 的关系运算。例如p==0或p!=0。
发布了76 篇原创文章 · 获赞 30 · 访问量 5854

猜你喜欢

转载自blog.csdn.net/weixin_45926367/article/details/104390123