文章

滴水-day28-this指针

This指针

在成员变量与函数参数同名的时候对参数进行操作的时候编译会报错,因为编译器不知道这里的x与y是参数的值函数成员变量的值?

这个时候就需要this指针了,this指针指向结构体首地址,也就是第一个成员变量地址,通过this指针可以让编译器知道这个参数是函数的值还是结构体的值。

不过在一些高版本编译器中好像不需要这样做了,我在vs2019中测试发现,即使这样写也可以通过编译。

编译器默认x与y就是函数的值。

但是想通过函数操作成员变量的值还是需要通过this指针

通过this指针获取结构体地址

uintptr_t GetAddress() {
		return reinterpret_cast<uintptr_t>(this);
	}

在对空结构体进行大小判断时候发现,空结构体的大小不是0,而是1.

个人理解为因为有this指针的存在,this指针没有一个明确的类型,只有结构体有成员变量的时候,这个成员变量的数据类型是多大,this指针类型就多大。

代码分析

struct Person
{
	void Fn_1()
	{
		printf("Person:Fn_1()\\\\n");
	}
	void Fn_2()
	{
		printf("Person:Fn_2()\\\\n");
	}
};

Person* p = NULL;
	p->Fn_1();
	p->Fn_2();

这个代码可以执行

通过调试发现,虽然调用这个函数的时候没有传递参数,结构体也没有成员变量,他还是传递了一个0进去,

这是不是意味这没有成员变量结构体会默认有一个数据类型为0的变量呢?

这个代码可以运行是因为,即使他给p指针设置为空,但是这个结构体并没有成员变量,也就没有this指针的存在,所以可以运行。

struct Person
{
	int x;
	void Fn_1()
	{
		printf("Person:Fn_1()\\\\n");
	}
	void Fn_2()
	{
		x = 10;
		printf("Person:Fn_2()%x\\\\n");
	}
};
Person* p = NULL;

	p->Fn_1();
	p->Fn_2();

这个代码就不可以运行了,因为结构体有成员变量,且P指针赋值为空,这样就意味这这个p对象此时执行的结构体是没有this指针的,在Fn-2函数中对x赋值,但是this指针为空,编译器找不到x的地址,所有无法对x进行赋值,这里就会报this空指针异常。

License:  CC BY 4.0