从零开始学习c++之初识指针和引用

指针:

指针(pointer) 是一个值为内存地址的变量   内存地址一般使用16进制表示比如0028FF44

指针的本质只是一个变量,指针大小为4个字节

指针的声明:

        //第一种声明方式
	int* ptr_i1;    //偏向于地址,p理解为一个地址变量,int*是类型   
	//第二种声明方式
	int *ptr_i2;   //偏向于值,*p理解为一个int型变量,能表示一个整型值
	//其他两种声明方式
	int * ptr_i3;
	int*ptr_i4;
关于指针声明方式*位置的不同:一元运算符*是间接寻址或间接引用运算符,当它作用于指针时,将访问指针所指向的对象。

int *ptr这样声明时便于记忆,该声明的表达式*ptr的结果是int类型,一般使用这种声明方式。


指针的赋值:

        int i1;      //变量
	i1 = 100;
        ptr_i1 = &i1;    //&表示获取地址变量
	*ptr_i1 = 200;         //*表示取地址变量所对应的变量
	cout << *ptr_i1<<endl;   //输出200  
	cout << i1<<endl;        //输出200
为指针赋值时,赋值运算符右侧必须是一个地址

指针类型:

        //1.空指针
	//一般指针初始化值为nullptr 必须初始化所有指针
	int *ptr1 = nullptr;       //等价于 int *ptr1= 0;       nullptr特殊的字面量的值,可以转化为任意指针类型
	//指针也可以赋值NULL 等价于nullptr 但需要包含头文件cstdlib
	int *ptr2 = NULL;
	cout << endl;

	//2.void *指针
	//void*指针存放一个内存地址,地址指向的内容是什么类型不能确定,所以用void*指针取得的变量不能修改变量值
	//void*指针一般用途:用于和别的指针比较、作为函数的输入和输出、赋值给另一个void*指针
	double num = 3.14;
	double *ptrNum1 = #
	void *ptrVoid1 = #
	cout << (ptrVoid1 == ptrNum1);
	//*ptrVoid1 = 4.11;        //无法这样修改,因为void*指针类型不确定 报错:表达式必须是指向完整对象类型的指针

指针与数组:

        //数组存储在一块连续的内存空间,数组名是这块连续内存空间的首地址
	double nums[5] = { 23,52,77,25,89 };
	double *ptrNum = nullptr;
	ptrNum = nums;    //直接指向数组
	//ptrNum = &nums[5];    //指向数组某个元素
	cout << ptrNum[3] << endl;     //当指针指向某一个数组,指针可以视为数组使用,因为数组名等于数组的首地址
	cout << sizeof(ptrNum) << endl;        //输出为4     指针变量占4个字节

指针的递增和递减:

        double scores[5] = { 55,29,19,66,82 };
	double *ptr_scores;
	ptr_scores = scores;
	for (int i = 0;i < 5;i++)
	{
		cout << *ptr_scores++ << endl;            //指针的++和--相当于指针在内存空间的平移,移动单位为T的大小
	}
	cout << endl;
	ptr_scores -= 2;    
	cout << *ptr_scores << endl;           //输出66

引用:

        //引用:为对象起了另外一个名字
	int value = 1024;
	int &refValue = value;        //refValue 指向value,是value的引用
	//错误引用: int &refValue2;      //引用必须被初始化

	//注意:引用并非对象,只是对一个已经存在的对象起的别名
	//引用只能绑定在对象上,不能指向一个字面值或者表达式  //错误写法:例如 int &refNum = 10; 
	//但有一种情况可以把引用指向一个常量
	const double &refCon = 10;        //正确写法 表示常量引用
	//引用必须被初始化,所以使用引用前不需要测试有效性,使用引用比使用指针效率高

指针与引用的关系:

1.引用是一种进行了简单封装的引用
2.引用底层仍然是指针,获取引用地址时,编译器会进行内部转换
3.引用的直接目的是为了让代码编写更加流畅


指针的简单应用:

使用指针来对一个数组进行逆序操作:

        //逆序:首元素和尾元素交换
	int arrays[8]{ 25,29,8,18,53,44,65,32};
	int *ptr_start = arrays;       //一个指针指向第一个元素
	int startCount = 0;
	int *ptr_end = arrays + 7;     //另一个指针指向最后一个元素
	int endCount = 7;
	int temp = 0;       //临时变量用于交换
	while (ptr_start < ptr_end)
	{
		temp = *ptr_start;			
		*ptr_start = *ptr_end;
		*ptr_end = temp;			
		ptr_start++;		
		ptr_end--;
		cout << ptr_start << "\t" << ptr_end << endl;
	}
	
	for (int i = 0;i < sizeof(arrays) / sizeof(int);i++)
	{
		cout << arrays[i] << endl;
	}

指针-自由空间分配:

        //使用new来请求系统系统从自由空间分配内存
	//new 返回一个指向分配的内存的指针
	int *p1 = new int;           //分配1个int
	int *p2 = new int[5];        //分配5个int

	delete p1;    //释放由new分配的内存  

	//使用new创建动态分配的数组
	int *intArray = new int[10];
	//使用delete[]释放内存
	delete[] intArray;
delete和new的使用:
1.delete与new配对,不要使用delete释放不是new的内存   
2.不能释放已经释放的内存
3.使用delete[]来释放用new[]为数组分配的内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值