C/C++++指针的地址、指针的值、指针所指向内容的值

1 篇文章 0 订阅
int i = 0;
int* ptr = &i;

Question:
	ptr		&ptr	*ptr	&*ptr各代表含义

  主要辨析一下C/C++中指针相关常见概念。
  首先理解指针所指向元素与指针,他的意思就相当于地图上你家的位置与你家里的实际情况。知道了指针(地图上的位置),就可以知道怎么去你家,但是无法知道你家中的具体情况,而指向元素则涵括了你家里的实际情况。
  但是有一个方法通过地址去访问家里的实际情况,就是 *ptr (即地图位置),此时假设你的家是home,地图上的位置时address,那么 *address就是通过某种方法(比如家里的照片) ,去查看home里的实际情况

  直接上一段代码:

#include<iostream>
using namespace std;
int main()
{
	int i = 0;
	int* ptr_1;
	int* ptr_2;

	cout << i << endl;				// i 的值为 0 
	cout << &i << endl;				// i 的地址为 00AFF74C

	ptr_1 = &i;						// 让 ptr_1 指向 i
	cout << &ptr_1 << endl;			// ptr_1 的地址 00AFF740
	cout << ptr_1 << endl;			// ptr_1 的内容 00AFF74C
	cout << *ptr_1 << endl;			// ptr_1 所指向单元的内容 0
	cout << &*ptr_1 << endl;		// ptr_1 所指向单元的地址 00AFF74C

	ptr_2 = ptr_1;
	cout << &ptr_2 << endl;			// ptr_1 的地址 00AFF734
	cout << ptr_2 << endl;			// ptr_1 的内容 00AFF74C
	cout << *ptr_2 << endl;			// ptr_1 所指向单元的内容 0
	cout << &*ptr_2 << endl;		// ptr_2 所指向单元的地址 00AFF74C

	return 0;
}

  首先,ptr_1指针指向了 int 型数据,第12行将 ptr_1 指向了 i,主要来理解 row13、14、15、16

  第13行, &ptr_1, 意思是 ptr_1 的地址,这里需要区分,ptr_1 的地址并不是 i 的地址,怎么理解呢,ptr_1 就相当于变成了 i 的朋友,ptr_1 能够知道 i 的地址在哪,但并不是说ptr_1和i的地址就是一样的。

  第14行,ptr的值其实就是i的地址,这个就和开篇的描述联系了起来,通过匹配(ptr_1 = &i;),此时ptr_1 的值就是i的地址

  第15行,*ptr_1 实际上就是通过地址来查询 ptr_1指针所指向内存单元的内容

  第16行,*ptr_1首先对ptr_1做解引用,之后再输出 *ptr_1的地址,也就是说,*ptr_1 即为 i,所以也就是输出i在内存中的地址

  同样,*ptr_2 = *ptr_1就是用ptr_1指针来初始化ptr_2指针,这就实现了多个指针指向同一内存单元,当然也可以通过 *ptr_2 = &i 来实现这个功能。

总之:

  1. 指针有自己的内存地址,也就是说指针本身是占用内存的
  2. 指针指向的是某一个地址,因此指针赋值必须是赋值地址而不是值,如 int 型指针 ptr 指向 int 型变量 i ,必须只能是 ptr = &i ,否则会报错,因为 int 型变量无法赋值给 *int 型变量
  3. 由一得:&ptr 指的是指针本身的地址,由二得,*ptr 指的是指针所指向内存单元的数据,&*ptr 指的是指针指向内存单元的地址。
  • 21
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值