C++中关于 *、&、this运算符对象创建知识点

int a=0;
//这个简单声明会做如下操作:
//1.在内存中开辟sizeof(int)个字节空间,
//2.赋值为0
//对于这个表达式,变量名a代表的就是内存空间内的值,而不是该变量在内存中的地址
//若要获得变量a在内存中的地址,使用取址符 & 可以得到十六进制的内存地址,如下示例:
#include <iostream>
using namespace std;

void main()
{
	int a = 11;

	cout << &a << endl;
}

*和&运算符的用法:

//此部分是对指针的理解
//可以通过指针来保存一个变量的地址,且指针类型要和变量类型相同
void main()
{
	int a=11;
	int * b=&a;//正确,声明int类型指针b保存int类型变量a的地址
	//char* ch = &a;//错误 指针类型要和变量类型相同
	
	int c=*b;//通过给指针变量前加*实现对指针变量的解引用,获得指针变量b中地址对应的内存中的int型的值,此处获得的c的值应为11
}
//指针所占内存空间(只和编译模式有关,和其他无关):
//在64位编译模式下,指针的占用内存大小是8字节
//在32位编译模式下,指针占用内存大小是4字节
//可由下面代码进行验证
void main()
{
	int a = 10;
	int* b = &a;

	cout << sizeof(b) << endl;
}

//空指针:指针变量指向内存中编号为0的空间,用于初始化指针。
//内存编号0~255是系统占用内存,用户不能访问,故空指针不能被访问。如下示例
//指针变量中存的就是地址,NULL就相当于内存地址编号0。
void main()
{
	int* c = NULL;
	cout << *c << endl;//执行到这会报Exception thrown: read access violation.c was nullptr.错误
}

//野指针:指针变量中的地址是非法的内存地址
//如下示例,随意(非自己开辟的内存)定义一个指针就想操作它对应的内存编号就是非法的
void main()
{
	int* d=(int *)0x1199;
	cout << *d << endl;//这一步报错,因为地址0x1199并不是你开辟的,没资格去访问该地址编号对应的内存中的数据信息
}

//const修饰指针
//1.const修饰指针 --常量指针
//指针中的地址可以修改,但指针中的地址对应的内存中的值不能修改
//例:const int * b=&a;
//2.const修饰常量 --指针常量
//指针中的地址不能修改,但指针中的地址对应的内存中的值可以修改
//例:int  * const b=&a;
//3.const即修饰指针,又修饰常量
//const int  * const b=&a;
void main()
{
	int a = 10;
	int* b = &a;

	//常量指针
	const int* e = &a;
	int aa = 100;

	e = &aa;
	//*e = 100;//error 指针中地址对应的值不能修改
	cout << *e << endl;

	//指针常量
	int * const ee = &a;
	//ee = &aa;//error 指针中的地址不能修改
	*ee = 1000;

	const int* const eee = &a;
	//eee = &aa;//Error
	//*eee = 101;//error 
}

//指针和数组
//数组名就是数组的首地址。对数组名解引用出的结果就是数组的第一个元素的值
//内存中的地址是十六进制,每加1都是一个字节。int型数组的地址偏移量就应该是4个字节。
void main()
{
	int arr[] = { 1,3,2 };
	cout << arr[0] << endl;
	cout << *arr << endl;
	for (int i = 0; i < 3; i++)
	{
		cout << *(arr+i) << endl;//偏移一个int型的i就是数组首地址加4,刚好得到第二个元素的首地址
	}
}

//指针和函数

//函数形参是普通变量时,都是生成原始变量的副本进行参数的传递,并不会改变原始参数的值,如下:
void Swap(int a,int b)
{
	int temp = a;
	a = b;
	b = temp;
	cout << "Swap a" << &a << endl;
	cout << "Swap b" << &b << endl;
}
void main()
{
	int a = 11;
	int b = 22;
	Swap(a,b);
	cout << " a" << &a << endl;
	cout << " b" << &b << endl;
}

//指针变量作为参数
//可以交换两个变量值的方法为:方法1和方法3
//方式1:会修改原始参数的值。
void Swap(int* a,int* b)
{
	int * temp = *a;
	*a = *b;
	*b = *temp;
	cout << "Swap a" << a << endl;
	cout << "Swap b" << b << endl;
}
void main()
{
	int a = 11;
	int b = 22;
	//Swap(a,b);
	Swap(&a,&b);
	cout << " a " << a << endl;
	cout << " b " << b << endl;
}
//方式2:不会修改原始参数的值,只是在函数中临时修改了两个指针变量中存放的地址值,而指针变量中存放的地址值对应的数据并未修改,函数执行完毕后,参数的指针变量就销毁了
void Swap(int* a, int* b)
{
	cout << "Swap a " << a << endl;
	cout << "Swap b " << b << endl;
	cout << "Swap a " << *a << endl;
	cout << "Swap b " << *b << endl;
	cout << "Swap &a " << &a << endl;
	cout << "Swap &b " << &b << endl;
	int * temp = a;
	a = b;
	b = temp;
	cout << "Swap a " << a << endl;
	cout << "Swap b " << b << endl;
	cout << "Swap a " << *a << endl;
	cout << "Swap b " << *b << endl;
}
void main()
{
	int a = 11;
	int b = 22;
	//Swap(a,b);
	Swap(&a,&b);
	cout << " a " << &a << endl;
	cout << " b " << &b << endl;
	cout << " a " << a << endl;
	cout << " b " << b << endl;
}
//方法3:此方法可以实现两个变量值的交换。
void Swap1(int & a, int &b)
{//函数参数使用&(引用符号)就是给原来的变量起了一个别名,直接将该对象引用进来,由地址可以看出
	cout << " &a " << &a << endl;
	cout << " &b " << &b << endl;
	cout << " a " << a << endl;
	cout << " b " << b << endl;
	int temp = a;
	a = b;
	b = temp;
}
void main()
{
	int a = 11;
	int b = 22;
	//Swap(a,b);
	//Swap(&a,&b);
	Swap1(a,b);
	cout << " &a " << &a << endl;
	cout << " &b " << &b << endl;
	cout << " a " << a << endl;
	cout << " b " << b << endl;
}

this关键字

//类中成员函数的this用法
//类对象中的this就是该类创建的对象的地址
class Person
{
public:
	Person(int age,int c)
	{
		this->age = age;
		this->c = c;
	}
	void Show()
	{
		cout<<this<<endl;//打印出的是一个地址
		cout<<&this->age<<endl;
		cout << &this->c << endl;
	}
	Person Return()//不加&,就是返回当前对象的一个副本
	{
		return *this;//this本身是地址,相当于指针,解引用获得对象并返回
	}
	Person& Return1()//加&,就是给当前对象起了别名,就是返回当前对象本身
	{
		return *this;//this本身是地址,相当于指针,解引用获得对象并返回
	}
private :
	int age;
	int c;
};

void main()
{
//①和③输出的地址应该是相同的,因为他们返回的this都是p的地址
//②输出的地址是对象p的副本的地址
	Person p(1,2);
	p.Show();//①
	
	p.Return().Show();//②
	p.Return1().Show();//③
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值