c++ (指针:一种有类型的地址)

#include<iostream>
#include<string>
using namespace std;
struct MyStruct
{
	int name = 1;
	char a = 'n';
	string b = "hello world";
	
}mystruct;
int main() {
	
	
	/*int a = 1000;
	void* ptr = &a;

	int* ptr2 = (int*)ptr;

	cout << *ptr2 << endl;*/
	MyStruct* M = &mystruct;
	cout << *(char*)((int*)M + 1) << endl;
	cout << *(char*)((char*)M + 4) << endl;
	return 0;
}

下面的代码虽然没有任何实际意义,但有助于剖析指针。如果想用指针取结构体中字符a,cout << *(char*)((int*)M + 1) << endl;cout << *(char*)((char*)M + 4) << endl;两行具有同样的效果,结构体中包含int char string 三种类型;指针M代表结构体的起始地址,将m强转int*,只要+1就跨过name,再强转char*,解引用就可以拿到char a的值。同样的道理强转char*就需要加4个字节的偏移量。

#include<iostream>
#include<string>
using namespace std;
struct MyStruct
{
	int name = 1;
	char a = 'n';
	string b = "hello world";
	
}mystruct;
int main() {
	
	
	/*int a = 1000;
	void* ptr = &a;

	int* ptr2 = (int*)ptr;

	cout << *ptr2 << endl;*/
	MyStruct* M = &mystruct;
	cout << *(string*)((int*)M + 2) << endl;
	cout << *(string*)((char*)M + 8) << endl;
	return 0;
}

如果想拿到helloworld呢?同样的方法,(int型与char型字节对齐,所要跨过8个字节)最后将其转化为string*型的地址存储空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CV_er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值