美文网首页
C++ 什么是指针

C++ 什么是指针

作者: 付凯强 | 来源:发表于2020-11-22 00:40 被阅读0次

序言

我们平时所说的指针其实是指针变量。而指针变量,顾名思义,是含有指针的变量。而这个指针指的是内存地址。所以指针变量也可以说是含有内存地址的变量。

指针

系统的内存就像是带有编号的小房间,如果想使用内存就需要得到房间号。假如定义一个整型变量i,它需要4个字节,这个时候编译器为变量i会分配连续编号的小房间,比如4001到4004.每个房间代表一个字节。


一个变量在内存中的存储

在程序代码中通过变量名来对内存单元进行存取操作,代码经过编译后会将变量名转换为该变量在内存的存放地址,对变量值的存取是通过地址进行的。比如,变量i在参与计算的时候,会找到变量名对应的内存地址,首先会找到变量i的地址4001,然后从4001开始读取4个字节数据放到CPU的寄存器中。

由于通过地址能访问指定的内存存储单元,可以说地址“指向”该内存单元,例如房间号4001指向系统内存中的一个字节。地址可以形象的称为指针,即一个变量的地址可以形象的称为该变量的指针。

指针变量

一个变量的地址可以形象的称为该变量的指针,所以存放指针(内存地址)的变量,就是指针变量,而这个变量的类型,称为指针类型。
我们平时所说的指针,是指"指针变量",而不是内存地址,毕竟我们写代码,是通过变量操作地址,而不是直接操作地址。
即我们平时说的指针是一种数据类型,通常说的指针就是指针变量,它是一个专门用来存放地址的变量,而变量的指针主要指变量在内存中的地址。
下文所说的指针都指的是指针变量。

指针的声明和赋值以及关于指针使用的说明

  • 声明
    int *i;
    float *a,*b;

分别声明了整型指针和浮点指针。

  • 赋值
  • 初始化时赋值
    int i = 100;
    int *p_ipoint = &i;
  • 后期赋值
    int *p_ipoint;
    int i = 100;
    p_ipoint = &i;
  • 说明
    int p_ipoint; ------ 指针变量名是p_ipoint,而不是p_ipoint。
    p_ipoint = &i; ------ 指取变量i的地址赋值给变量p_ipoint。

取值运算符和取地址运算符

"*" 和 "&" 是两个运算符,前者是取值运算符,后者是取地址运算符。

  • 获取变量的地址值
    int a = 100;
    int *p = &a;
    printf("%d\n",p);

    -536471336
  • 输出指针对应的数值
    int a = 100;
    int *p = &a;
    std::cout << " a=" << a << std::endl;
    std::cout << " p=" << *p << std::endl;
    a=100
    p=100

指针运算

指针变量存储的是地址值,对指针做运算就等于对地址做运算。

  • 输出指针运算后的地址值
    int a = 100;
    int *p = &a;
    printf("address:%d\n",p);
    p++;
    printf("address:%d\n",p);
    p--;
    printf("address:%d\n",p);

    address:-422471464
    address:-422471460
    address:-422471464

说明:定义指针变量必须指定一个数据类型。

指向空的指针与空类型指针

指针可以指向任何数据类型的数据,包括空类型(void): 定义如下:

void *p;

空类型指针可以接受任何类型的数据,当使用它时,可以将其强制转化为所对应的数据类型。

    int *pI = NULL;
    int i = 4;
    pI = &i;
    float f = 3.333f;
    bool b = true;
    void *pV = NULL;
    cout<<"依次赋值给空指针"<<endl;
    pV = pI;
    cout<<"pV = pI ----- "<<*(int*)pV<<endl;
    cout<<"pV = pI ----- 转为float类型指针"<<*(float*)pV<<endl;
    pV = &f;
    cout<<"pV = &f ----- "<<*(float*)pV<<endl;
    cout<<"pV = &f ----- 转为int类型指针"<<*(int*)pV<<endl;

    依次赋值给空指针
    pV = pI ----- 4
    pV = pI ----- 转为float类型指针5.60519e-45
    pV = &f ----- 3.333
    pV = &f ----- 转为int类型指针1079332831

可以看到空指针被赋值后,转化为对应类型的指针才能得到我们所期望的结果。若将它转换为其他类型的指针,得到的结果将不可预知,非空指针类型指针同样具有这样的特性。

指针常量与指向常量的指针

  • 指针常量
    同其他数据类型一样,指针类型也有常量,使用const关键字形式如下:
    int i = 9;
    int* const p = &i;
    cout<<"指针变量p中的指针指向的内存地址是"<<p<<endl;
    cout<<"指针变量p中的指针指向的内存地址是"<<*p<<endl;
    *p = 3;
    cout<<"指针变量p中的指针指向的内存地址是"<<p<<endl;
    cout<<"指针变量p中的指针指向的内存地址是"<<*p<<endl;

    指针变量p中的指针指向的内存地址是0x7ffee86d58d8
    指针变量p中的指针指向的内存地址是9
    指针变量p中的指针指向的内存地址是0x7ffee86d58d8
    指针变量p中的指针指向的内存地址是3

将关键字const放在标识符前,表示这个数据本身是常量,数据类型是int*,即整型指针。与其他常量一样,指针常量必须初始化。我们无法改变常量指针的内存指向,但是可以改变它指向内存的内容。

  • 指向常量的指针
    若将关键字const放到指针类型的前方,形式如下:
    int i = 9;
    int const *p = &i;

这是指向常量的指针,虽然其所指向的数据可以通过赋值语句进行修改,但是通过该指针修改内存内容的操作是不被允许的。

  • 当const以如下形式使用时:
    int i = 9;
    int const* const p = &i;

该指针是一个指向常量的指针常量。既不可以改变他的内存指向,也不可以通过他修改指向内存的内容。

后续

如果大家喜欢这篇文章,欢迎点赞;
如果想看更多C++方面的技术知识,欢迎关注!

相关文章

  • C++ 什么是指针

    序言 我们平时所说的指针其实是指针变量。而指针变量,顾名思义,是含有指针的变量。而这个指针指的是内存地址。所以指针...

  • C++知识点

    C++基本方法: C++ memcpy C++基本特性: C++引用(vs指针) C++指针 C++封装: 将...

  • Go教程第十篇:指针

    指针 在这篇教程中,我们将学习Go里面的指针是如何工作的,以及Go的指针和C/C++的区别和差异。 什么是指针 ?...

  • 智能指针share_ptr的若干问题

    一 什么是智能指针 c++的智能指针是利用了c++的RAII机制,这样可以及时的释放资源,且即使代码中触发了异常,...

  • Android智能指针分析

    Android智能指针分析总结 什么是智能指针 C++ 指针需要手动释放,否则会造成内存泄露,但是如果项目工程比较...

  • Java基础

    Java和C++的区别?a. Java没有指针。c++可以通过指针直接操作内存,但这个动作是危险的,指针引起的操作...

  • c++智能指针用法

    智能指针是什么 智能指针是c++中有四个智能指针:auto_ptr、shared_ptr、weak_ptr、uni...

  • C++ 、java 和 C# 的区别

    一、基础类型 c++: ** java:** C#: 二、指针 1.java 是没有指针这个概念,c++ 和 c#...

  • C++ 指针常量、常量指针和常指针常量

    参考:C++ 指针常量、常量指针和常指针常量

  • golang 基础(12)指针

    指针 在 go 语言中指针没有 c++ 中那么复杂,因为没有指针的运算。 什么时候用指针,也就是指针的用途 可能结...

网友评论

      本文标题:C++ 什么是指针

      本文链接:https://www.haomeiwen.com/subject/exyymktx.html