C++语言入门-指针

前言

指针是一种数据类型,被称为"指针类型"。指针类型描述的是一个地址,这个地址指向内存中另外一个对象的位置。

简单的说,指针表示的是它所指向对象的地址。这些地址包括变量,数组或函数。

本文所有案例代码:

来源:诚通网盘 | 提取码:unitymake

地址

C++编译系统在编译时会为不同数据类型的对象分配大小不同的存储空间。每个储存空间都有一个固定的编号。根据这个地址即可准确找到并访问这些储存单元。

指针

基本概念:通过指针间接访问内存

目的:记录内存地址编号

定义指针

指针定义语法:数据类型 *指针变量名

   
    int a =10;//开辟空间
    int *p;//定义指针变量
    //让指针记录变量a的地址
    p=&a;//取到数据变量a的地址
    cout<<"Value(a):"<<a<<endl;
    cout<<"Loc(a):"<<&a<<endl;
    cout<<"Loc(p):"<<p<<endl;//指针记录地址编号 输出p即输出数据变量地址
    cout<<"&p:"<<&p<<endl;
    cout<<"*p:"<<*p<<endl;

查看调试结果:点击这里

操作指针

可以通过解引用的方式来找到指针指向的内存。

指针前加*号,代表找到了p指向的内存中的数据。=> *p

示例:

#include <iostream>
using namespace std;
#include "stdlib.h"
int main()
{
    int a =10;//开辟空间
    int *p;//定义指针变量
    //让指针记录变量a的地址
    p=&a;//取到数据变量a的地址
    cout<<"Value(a):"<<a<<endl;
    cout<<"Loc(a):"<<&a<<endl;
    cout<<"Loc(p):"<<p<<endl;//指针记录地址编号 输出p即输出数据变量地址
    cout<<"&p:"<<&p<<endl;
    cout<<"*p:"<<*p<<endl;

    cout<<"------------"<<endl;
    //使用指针
    *p=666;
    cout<<"Value(a):"<<a<<endl;
    cout<<"Loc(a):"<<&a<<endl;
    cout<<"Loc(p):"<<p<<endl;//指针记录地址编号 输出p即输出数据变量地址
    cout<<"&p:"<<&p<<endl;
    cout<<"*p:"<<*p<<endl;
    
    system("pause");
    return 0;
}

查看调试结果:点击这里

 指针所占内存空间

  • 在32位操作系统下:占用4个字节空间。(一个字节等于8位)
  • 在64位操作系统下:占用8个字节空间。(一个字节等于8位)

准确来说应该说内存地址所占4/8个字节空间

空指针和野指针

空指针:指针变量指向内存中编号(内存地址)为0的空间

用途:初始化指针变量

注意:空指针指向的内存不可以访问,不可以使用的,只用于赋值。

2022/10/28 0:30 今天没心思学习,只想早点睡。


野指针

指针变量指向非法的内存空间,会导致指针报错!

  • 最好不要对地址直接进行操作

const修饰指针

  1. const修饰指针 --- 常量指针
    const修饰*p 表示通过指针所指的值是常量,指针的指向可以修改,指针指向的值不可修改

  2. const修饰常量 --- 指针常量
    const修饰p,表示指针是常量,指针的指向不可以改,通过指针指向的值可以改。
  3. const修饰指针和常量
    const即修饰指针,有修饰常量。
    指针的指向和通过指针的指向的值都不可以改。

看指针是常量指针还是指针常量,看const修饰的目标是指针还是常量(*p) ,若const修饰*p 表示通过指针所指的值是常量,那么指针的指向可以修改,通过指针指向的值不可修改。若const修饰p,表示指针是常量,指针的指向不可以改,通过指针指向的值可以改。

 

2022/10/30 22:30


2022/11/8 21:48

在写引用变量的笔记,想从指针笔记中提取出相似点。回过头来查阅,才发现指针这块落写了一些内容,今天给它补全。

指针作函数参数

C++ 允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。

现在,让我们来看下面的函数,是如何交换两个Int类型的值的。

void SwapNumByPointer(int *a,int *b)
{
    int temp=*a;
    *a=*b;
    *b=temp;
}

void main()
{
int a=1;
int b=2;
SwapNumByPointer(&a,&b);
cout<<"a:"<<a<<endl;
cout<<"b:"<<b<<endl;
system("pause");
}

当上面的代码被编译和执行时,它会产生下列结果:

 

2
1

关于指针作函数参数的具体用法,可见文章  C++基础入门 – 值传递与引用参数|指针与函数,这里就不再赘述了。

指针作返回值

在上面,我们已经了解 C++ 中指针如何作函数参数。与其他对象类似地,C++ 也允许您从函数返回指针。

示例:

void assignment03()
{
    int a=1;
    int b=2;
    cout<<"max:"<<*GetMax((int*)&a,(int*)&b)<<endl;
}
int main()
{
    // assignment1();
    // assignment02();
    assignment03();
    system("pause");
    return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

 

max:2

另外注意,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static变量。

函数指针

定义一个函数指针 返回值类型 (*函数指针名)(参数类型列表); 

使用函数指针调用函数同函数调用一样,只要在函数指针后面加上实参列表即可。

int func(int var)
{
    printf("%d",var);
    return 1;
}
int main()
{
    //函数指针
    int (*funcPtr)(int);
    funcPtr=func;
      //funcPtr = &func;
    printf("%d",funcPtr(0));
}

函数指针也可以作为其它函数的参数

void method(int (*funcPtr)(int)) {int val=funcPtr(1);}
作者:Miracle
来源:麦瑞克博客
链接:https://www.unitymake.com/archives/programming-life/cpp/2196
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!
THE END
分享
打赏
海报
C++语言入门-指针
前言 指针是一种数据类型,被称为"指针类型"。指针类型描述的是一个地址,这个地址指向内存中另外一个对象的位置。 简单的说,指针表示的是它所指向对象的地址……
<<上一篇
下一篇>>
文章目录
关闭
目 录