笔记06:C++中的指针

1.指针含义

计算机在存储数据的时候必须跟踪3种基本属性

1.存储位置
2.存储的值
3.存储的信息类型

指针是一个变量,存储的是地址。 所以指针本质是一个地址!看到指针条件反射想到地址。
对于一个常规变量,&运算符就能够取得他的地址。所以一个变量var,那么&var就是一个地址。
输出地址是以十六进制来输出的。
对于一个指针变量pointer,*pointer表示解除引用,将其应用于指针,可以得到该地址存储的值。且这个值就是常规的值。

#include <iostream>
int main()
{
    int a=3;
    std::cout<<"the address of a:"<<&a<<std::endl;

    int* p_a=&a;
    std::cout<<"the value of p_a is:"<<p_a<<std::endl;
    std::cout<<"*p_a:"<<*p_a<<std::endl;
    return 0;
}

12115116-9decba5efffff36b.png
运行结果

可以知道,这里的int变量和指针变量就像同一个硬币的正反面。变量表示值,可以使用&来得到地址。 指针变量表示地址,并且可以使用*来得到值 .
p_a和a就是等价的。这个一定要知道,是后面修改的基础。&(取址运算符)和(间接访问运算符/解引用指针)。

2.指针的应用

交换a,b的值

#include <iostream>
using namespace std;

void swap1(int *a, int *b)
{
    int c;
    c = *a;
    *a = *b;
    *b = c;
}
int main()
{   
    int a = 1, b = 5;
    cout << "交换前:" << endl;
    cout << "a:" << a << "  " << "b:" << b << endl;
    swap1(&a, &b);
    cout << "交换后:" << endl;
    cout << "a:" << a << "  " << "b:" << b << endl;
    system("pause");
    return 0;
}
12115116-74dd9fd9f3d2aaf4.png
运行结果

通过指针来交换a,b的地址,来达到交换a,b值的目的,如果不使用指针,而是直接将实参a,b传给形参,最终结果a,b的值并不会交换。

还有一种不使用指针的方法来达到交换的目的,就是使用引用&。程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。

#include <iostream>
using namespace std;

void swap1(int &a, int &b)
{
    int c;
    c = a;
    a = b;
    b = c;
}
int main()
{   
    int a = 1, b = 5;
    cout << "交换前:" << endl;
    cout << "a:" << a << "  " << "b:" << b << endl;
    swap1(a, b);
    cout << "交换后:" << endl;
    cout << "a:" << a << "  " << "b:" << b << endl;
    system("pause");
    return 0;
}
12115116-ed9e58b02066006f.png
运行结果

3.*和&的多重含义

*和&既能用作表达式里的运算符,也能作为声明的一部分出现,符号的上下文决定了符号的意义:

int i = 42;    
int &r = i;  //&紧随类型名出现,因此是声明的一部分,r是一个引用
int *p;     //*紧随类型名出现,因此是声明的一部分,p是一个指针
p = &i;   //&出现在表达式中,是一个取地址符
*p = i;   //*出现在表达式中,是一个解引用符
int &r2 = *p;  //&是声明的一部分,*是一个解引用符

4.指针使用时需要注意的点(持续更新):

  • 1,初始化所有指针,使用未经初始化的指针是引发运行时错误的一大原因。如果真的不清楚指针应该指向何处,就把它初始化为nullptr或者0
  • 2,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值