作者邮箱: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;
-
声明和初始化一个指针
计算机需要跟踪指针指向值的类型,不同类型存储时的内部格式,占用内存长度等均有不同。因此,指针声明必须指定指向数据的类型。
在上面的例子包含这样的声明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;
这是通过强制类型转换把数字转换为适当地地址类型.
其余文章:
数组与指针基础内容:
网友评论