C++指针与引用

目录

一 指针

二 引用


一 指针

指针是一个变量,其值为另一个变量的内存位置的直接地址。在使用指针存储其他变量地址之前,需要指针进行行声明。

每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。

指针使用实例代码:

#include <iostream>

int main() {

    //定义一个变量
    int a = 199;
    //使用取地址符 & 获取变量的地址,并输出变量的地址
    std::cout << "a 的地址为:" << &a << std::endl;

    //定义一个指针变量p,指向变量a的地址
   /* 用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。
    所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,
    都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。*/
    int *pInt=&a;

    //输出指针变量存储的地址
    std::cout<<"指针p存储的地址是:"<<pInt<<std::endl;

    //获取指针变量指向的地址的值
    std::cout<<"指针pint指针指向的地址的值为:"<<*pInt<<std::endl;

    return 0;
}

与指针相关的几个重要概念:

概念

描述

C++ Null 指针

C++ 支持空指针。NULL 指针是一个定义在标准库中的值为零的常量。

C++ 指针的算术运算

可以对指针进行四种算术运算:++、--、+、-

C++ 指针 vs 数组

指针和数组之间有着密切的关系。

C++ 指针数组

可以定义用来存储指针的数组。

C++ 指向指针的指针

C++ 允许指向指针的指针。

C++ 传递指针给函数

通过引用或地址传递参数,使传递的参数在调用函数中被改变。

C++ 从函数返回指针

C++ 允许函数返回指针到局部变量、静态变量和动态内存分配。

实例代码演示:


#include <iostream>

const int length=10;

int main() {
    //如果一个指针没有指向任何地址,那么建议把该指针赋予一个NULL值或nullptr值,NULL或nullptr指向常量数字0
    int *p= nullptr;
    //这样,当判断该指针是否初始化完成时,就可以用if判断了
    if (p== nullptr) std::cout<<"p是null"<<std::endl;
    else std::cout<<"p不是null"<<std::endl;
    std::cout<<"null等于:"<<p<<std::endl;


    //对指针进行四种算术运算:++、--、+、- ,为了便于演示,我们先申明一个数组来配合指针使用
    int array[length]={22,33,55,12,32,15,56,77,89,90};
    int *p2=array;
    //使用指针自增符号
    for (int i = 0; i < length; ++i) {
        std::cout<<"第"<<i+1<<"个元素的值为:"<< *p2 <<std::endl;
        //每一次循环使指针p2自增1,int型的指针自增1相当于把指针指向的位置向下移动四个字节;
        p2++;
    }

    //首先把指针指向数组的最后一个元素的地址
    p2=&array[length-1];
    //使用指针自减符号
    for (int i =length-1; i >=0; i--) {
        std::cout<<"第"<<i+1<<"个元素的值为:"<< *p2 <<std::endl;
        //每一次循环使指针p2自增1,int型的指针自增1相当于把指针指向的位置向下移动四个字节;
        p2--;
    }


    p2=array;
    //指针使用+号
    std::cout<<"p2+2后指向的地址的值为:"<< *(p2+2)<<std::endl;

    p2=&array[length-1];
    //指针使用+号
    std::cout<<"p2-2后指向的地址的值为:"<< *(p2-2)<<std::endl;

    //直接使用指针进行比较: 如果当前的指针的地址与数组的第三个元素相等,那么就输出相等,否则不相等。
    if (p2==&array[7])  std::cout<<"p2==&array[2]结果是相等的"<<std::endl;
    else std::cout<<"p2==&array[2]结果是不相等的"<<std::endl;


    //指针数组: 就是数组的元素也是指针
    int *pointers[length]; //申明指针数组,拥有length个指针元素
    //使用int类型值给指针赋值
    for (int i = 0; i < length; ++i) {
        pointers[i]=&array[i];
    }
    //从数组指针里面取值
    std::cout<<"指针数组pointers[2]第二个元素的值为:"<<*pointers[1]<<std::endl;

    //可以用一个指向字符的指针数组来存储一个字符串列表,不过必须要用常量修饰符const修饰
    const char *list[2]={"hello","world"};
    //变量字符数组
    for (int i = 0; i < 2; ++i) {
        std::cout<<list[i]<<std::endl;
    }



    //指向指针的指针:  指针本身指向了另外一个指针的地址(指针本身也是需要内存来存储的其地址的),指向指针的指针类似与链条一样,层层链接
    int core=10009;
    int *pp;
    pp=&core; //给指针赋值
    int **ppp=&pp;  //把pp指针的指针赋给二级指针ppp,二级指针申明时需要用两个 **号
    //取得二级指针的值,也是需要带两个 ** 号
    std::cout<<"**ppp的值为:"<<**ppp<<std::endl;

    return 0;
}

二 引用

引用与指针的不同:

不存在空引用。引用必须连接到一块合法的内存。

一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。

引用必须在创建时被初始化。指针可以在任何时间被初始化。

实例代码:


//申明一个以引用为返回值和参数的函数
int &count(int& a,int& b);

//实现定义
int &count(int& a,int& b){
    //因为局部变量的作用域只在当前函数内,所有这里的sum需要申明为静态的,需要出了该方法之后依然有效
    static int sum=a+b;
    return sum;
}

int main() {

//把引用作为函数参数和参数返回值使用
int sum= count(core,core);
std::cout<<"使用引用函数返回的引用,其值为:"<<sum<<std::endl;



}

代码clone地址: git@gitcode.net:XiaoWang_csdn/cpp_7_pointerandquote.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值