笔记06:C++中的指针

2018-11-12  本文已影响5人  Wayne_Dream

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;
}
运行结果
可以知道,这里的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;
}
运行结果

通过指针来交换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;
}
运行结果

3.*和&的多重含义

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读