cpp数组(二):认识指针

2019-05-20  本文已影响0人  浩波千里

作者邮箱:z_zhanghaobo@163.com
github相关: https://github.com/HaoboLongway/simple_examples

处理存储数据时,把将地址视为指定的量,而将值视为派生量。一种特殊类型的变量——指针用于存储值的地址。因此,指针表示的是地址。*运算符被称为间接值或解除引用(dereferencing)运算符,将其应用于指针,可以得到该地址存储的值(C++通过上下文确定*是解引用还是乘法单目运算符)。
下面的例子演示了指针的基础用法

int updates = 6;    //declare a variable
    int *p_updates;    //declare pointer to an int
    p_updates = &updates;    //assign address of int to pointer

    //express the VALUE
    cout<<"Value: updates = "<<updates;
    cout<<", *p_updates = "<<*p_updates<<endl;

    //express the ADDRESS
    cout<<"Addresses: &updates = "<<&updates;
    cout<<", p_updates = "<<p_updates<<endl;

    //use pointer to change the value
    *p_updates += 2;
    cout<<"Now updates = "<<updates<<endl;
  1. 声明和初始化一个指针
    计算机需要跟踪指针指向值的类型,不同类型存储时的内部格式,占用内存长度等均有不同。因此,指针声明必须指定指向数据的类型。
    在上面的例子包含这样的声明int *p_updates;,这表明*p_updates的类型是int型,因此p_updates一定为指针.我们说p_updates的类型是指向int的指针
    我们可以在声明语句中初始化指针,被初始化的是指针而非它指向的值,因此上面的例子这样写int *p_updates = &updates;

一定要在对指针解引用前初始化为一个确定的,适当的地址
在C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存,为数据提供空间是一个独立的步骤.
如果我们进行这样的操作:float *eg_ptr; *eg_ptr = 233333;在这个例子中,由于eg_ptr没有被初始化,它可能有任何值。但不管值是什么,程序都将它解释为一个存储233333的地址。这种错误会导致一些最隐匿,最难以跟踪的bug.

我们也可以在初始化指针时为其赋地址值,如:

int *pt;
pt = (int *) 0xB8000000;

这里注意,虽然计算机把指针作为整数来处理,但从概念上说,指针描述的是位置,如果把两个指针像整型那样相乘是没有意义的,因此不能简单地把整数赋给指针。因此,像是下面的做法是不合规范的

int *pt;
pt = 0xB8000000;
//在C99标准发布前,C语言允许这样做,
//但C++在类型一致方面要求地更严格,编译器会抛出错误消息,通告类型不匹配

具体分析这一条语句pt = 0xB8000000;这是通过强制类型转换把数字转换为适当地地址类型.


其余文章:

数组与指针基础内容:

指针运算
认识指针
数组指针
数组定义及其初始化

上一篇 下一篇

猜你喜欢

热点阅读