C++-从存储地址的角度分析指针和引用

首先我们只知道一个变量的大小和地址的分配是从定义开始的,初始化和赋值是将内容写入这个地址。关于引用,指针的区别我们参考下面这个图
在这里插入图片描述
在这里插入图片描述

int main()
{
	int a;
	int *a0;
	int *a1 = new int;
	a1 = &a;
	int &a2 = a;
	int &a3 = *a1;
	cout << a << "\n" << &a  <<"\n" << endl;
	cout <<a0 << "\n"  <<&a0 << "\n" << endl;
	cout << *a1 << "\n" << a1 << "\n" << &a2<< "\n" << endl;
	cout << a2 << "\n" << &a2 << "\n" << endl;
	cout << a3 << "\n"  << &a3 << "\n" << endl;
}

在这里插入图片描述
多级指针其实也是一样的道理
在这里插入图片描述

	int a;
	int *a0;
	int *a1 = new int;
	a1 = &a;
	int &a2 = a;
	int &a3 = *a1;

	int **a4=new int *;
	*a4 =a1;//要一个指针一个指针的解析

	cout << a << "\n" << &a  <<"\n" << endl;
	cout <<a0 << "\n"  <<&a0 << "\n" << endl;
	cout << *a1 << "\n" << a1 << "\n" << &a1<< "\n" << endl;
	cout << a2 << "\n" << &a2 << "\n" << endl;
	cout << a3 << "\n"  << &a3 << "\n" << endl;
	cout << **a4 << "\n" << *a4 << "\n" << "\n" <<a4<< "\n" << &a4 << endl;
}

在这里插入图片描述
你是否看过大名鼎鼎的烫烫烫和屯屯屯呢?
这两个分别对应没有初始化的栈字符和堆字符。因为C++“<<”的时候把字符地址输出为字符,而字符数组是没有结束符号"\0"的,所以导致占用了后面的内存地址倒置“神志不清”
如果需要查看字符和字符串的地址,我们可以使用下面的方法

int main()
{
	char a='s';
	char *b=new char;
	printf_s("%p\n", &a);
	//printf_s("%p\n", b);
	cout << static_cast<void *>(b) << endl;
	//cout << static_cast<void *>(&a) << endl;
}

在这里插入图片描述
其次我们要注意字符数组和字符串指针其实是可以转换的,字符串的地址和数组的地址一样,等于首字符字符的地址。也就是 **=[][];*=[];

int main()
{
	char ***a = new char**;//初始一个二级字符指针
	char b[2][2][2] = {'a','b','c','d','e','f','g','h'};
	**a = **b;//这里相当于new char  
	const char *c = "abcdef";//字符串常量
	cout << **b << endl;//指向*b的地址取数据,等价b[0][1]
	cout << *b << endl;//指向b的地址取数据,等价b[][]全部内容
	cout << b << endl;//其实是b[0][1]的地址
	cout << &b<< endl;//整个b的地址,从b[0][1]开始
	cout << **a << endl; //=**b
	cout << *a << endl;//=*b
	cout << a << endl;//这里不必同于b,因为char *a已经确定了a的地址
	cout << &a << endl;//a本身地址
	cout << *c << endl;//指向c第一个字符地址
	cout << c << endl;//取值
	cout << &c << endl;//c本身地址

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值