c++从零开始---复合类型之指针概念

指针是一个变量,其存储的是值得地址,而不是值本身。


本节使用的程序段

#include <iostream>
int main()
{
	using namespace std;
	int a = 1;
	// 地址运算符 & 的应用
		cout << "a value = " << a << endl; 
		cout << "a address = " << &a << endl; // 地址运算符得到 a 的地址
	// 解除引用运算符 * 的应用
		int b = 1;
		// 声明并且初始化指针
		int* ptr = &b;
		cout << "*ptr: " << *ptr << endl;
		cout << "ptr_value: " << ptr << endl;
	return 0;
}

1、如何找到常规变量的地址

使用地址运算符(&),就可以得到常规变量的地址。比如,Home 是一个变量,则 &Home 是它的地址。使用常规变量时,值是指定的量,而地址是派生量。具体使用参考程序段。

2、如何通过地址得到变量值

处理数据的策略与得到地址的策略刚好相反,将地址视为指定的量,而将值视为派生量。一种特殊的变量—指针,用于存储值的地址。因此,指针名表示的是地址。 * 运算符被称为间接值或解除引用运算符,将其应用于指针,可得到该地址处存储的值。比如 ptr 是一个指针,其对应的值为 value,那么有 value = *ptr;

3、声明和初始化指针

3.1 声明指针

计算机需要跟踪指针指向的值得类型。例如,char 的地址与 double 的地址所使用的字节数是不同的,并且它们存储值时使用的内部格式也不同。因此,指针声明必须指定指向的数据的类型

例如以下示例:

int *ptr;

这表明,*ptr 的类型为 int。由于 * 运算符被用于指针,因此 ptr 变量本身必须是指针。我们说 ptr 指向 int 类型,我们还说 ptr 的类型是指向 int 的指针,或 int * 。
这强调的是,int * 是一种类型—指向 int 的指针。它是一种复合类型。
指针变量不仅仅是指针,而是指向特定类型的指针。和数组一样,指针都是基于其它类型的。对于不同的类型(int、long 等),指针的内部操作不同。

3.2 指针变量的长度

指针指示某变量的地址,对于不同类型的变量,比如 char 或者 double,他们对应的指针变量的长度通常是相同的,也就是它们对应的地址长度通常是相同的。地址需要 2 个字节还是 4 个字节,取决于计算机系统。

3.3 初始化指针

3.3.1 先声明再初始化
int a = 1;
int *ptr;
ptr = &a;
3.3.2 声明的同时初始化

在这种情况下,被初始化的是指针,而不是它指向的值,即下面的语句将 ptr (而非 *ptr)的值设置为 &a:

int a = 1;
int *ptr = &a;

4、指针的危险

在 c++ 中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。 如下所示:

long * fellow;
* fellow = 223323;

fellow 在声明中表示为一个指针,但是上述代码并没有对指针进行初始化,也就是并没有给指针一个值,这个值为变量的地址。fellow 没有被初始化,那么其值可能是任何值,不管值为什么,程序都将它解释为存储 223323 的地址。如果 fellow 的值恰好为1000,计算机将把数据放在地址 1000 上。

因此,一定要在对指针应用解除引用运算符 (*)之前,将指针初始化为一个确定的地址。

此外,指针不是整型,因此不能简单地将整数赋给指针,也不能对指针进行算术运算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值