我是靠谱客的博主 追寻火,最近开发中收集的这篇文章主要介绍C++——指针,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、定义指针

符号&为取址符号,用于获取地;符号*用于定义指针。

如下代码所示:

	int higgens = 5;
	int* pt = &higgens;						  //指针变量*pt自身有一个地址 即&pt, 
                                              //pt存储地址&higgens,*pt则对应higgens的值
	cout << "higgens:" << higgens << endl;   //5
	cout << "&higgens:" << &higgens << endl; //higgens的地址
	cout << "*pt:" << *pt << endl;			  //5
	cout << "pt:" << pt << endl;			  //输出pt存储higgens的地址
	higgens = 10;
	cout << *pt << endl;                      //10,*pt的值始终随higgens改变而改变,
                                              //因为*pt指向的是higgens的地址

 二、数组指针

数组名就是数组首元素的地址,所以 *数组名 就可以用于访问数组第一个元素,*(数组名=+1)则为第二个元素地址,以此类推可访问数组元素。

//数组指针!!!
int abc[3] = { 1,2,3 };						//定义一个int型数组
cout << abc[1] << endl;						//2
cout << abc << endl;							//第一个元素的地址
cout << (abc + 1) << endl;					//第二个元素的地址
cout << *(abc + 1) << endl;					//2

三、占用空间

任意数据类型,32位下占用4字节,64位占用8字节。

空指针,一般用于初始化指针变量

//空指针
//空指针不允许进行访问,0~255的内存空间是系统占用的,不可以访问。
int* p = NULL;//空指针

四、const修饰指针

1.const修饰指针:常量指针

const修饰的是指针

特点:指针的值不可以改,指针的指向可以改。

//const修饰指针
int a = 10;
int b = 20;
//常量指针
const int* p = &a;//指针的指向可以修改,但值不可以修改。
cout << *p << endl;//10
//*p = 20;//这是错误的,指向的值不可以修改。
p = &b;//通过改变变量p存储的地址来改变指向的值
cout << *p << endl;//20

2.const修饰常量:指针常量

const修饰的是常量

特点:指针的指向不可以改,指针指向的值可以改。

//指针常量,指针的指向不可以改,指针指向的值可以改
int c = 10;
int d = 20;
int* const p = &c;
cout << *p << endl;//10
*p = 20;//指向的值可以改
cout << *p << endl;//20
//p = &d;//错误,指向不可以改

3.const既修饰指针,又修饰常量。

特点:指针的指向不可以改,指针指向的值可以改。

//const既修饰指针又修饰常量
const int* const p3 = &c;
//指针的指向不可以改,指针指向的值不可以改

五、指针和函数

1、值传递

#include <iostream>
#include <cstring>
using namespace std;
void jiaohuan(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
	//形参
	cout << "a=" << a << endl; 
	cout << "b=" << b << endl;
}
int main()
{
	//指针和函数
	//值传递
	//定义交换值的函数
	int a = 10;
	int b = 20;
	jiaohuan(a, b);    //输出a=20,b=10
	//实参
	cout << "a="<< a << endl; //10
	cout << "b="<< b << endl; //20
}

 2、地址传递

指针存放在栈中,栈的访问效率高于堆

#include <iostream>
#include <cstring>
using namespace std;
void jiaohuan(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
	//形参
	cout << "a=" << *a << endl;
	cout << "b=" << *b << endl;
}
int main()
{
	//指针和函数
	//值传递
	//定义交换值的函数
	int a = 10;
	int b = 20;
	jiaohuan(&a, &b);    //输出a=20,b=10
	//实参
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
}

六、new为指针分配内存

	//使用new为指针分配内存
	int nights = 1001;
	int* p_nights = new int;							//为int型指针*p_nights寻找一个存执int型的地址,返回给p_nights
	*p_nights = nights;								//给指针变量赋值1001
	cout << "&nights:" << &nights << endl;			//&nights:0115FB08    变量nights的地址
	cout << "&p_nights:" << &p_nights << endl;		//&p_nights:0115FAFC  指针变量*p_nights自身的地址
	cout << "p_nights:" << p_nights << endl;			//p_nights:01491E20   new分配给指针*p_nights的地址
	cout << "*p_nights:" << *p_nights << endl;		//*p_nights:1001		  指针*p_nights指向的值  
	//使用delete释放内存
	//!!!不能使用delete释放不是new分配的内存
	//!!!不能使用delete释放同一个内存快两次
	//!!!如果使用new[]为数组分配内存,则使用delete[]来释放
	//!!!如果是要用new为实体分配内存,则应使用delete释放(没有方括号)
	//!!!对空指针应用delete是安全的
	delete p_nights;									//删除指针*p_nights存储的地址
	//使用new创建动态指针数组
	double* p_p3 = new double[3];					//为指针创建一个动态数组,数组元素数量为3
	p_p3[0] = 0.2;									
	p_p3[1] = 0.5;
	p_p3[2] = 0.8;
	cout << "p_p3[1] is " << p_p3[1] << endl;
	p_p3 = p_p3 + 1;									//指针p_p3+1后指向下一元素的地址,指针加1后,增加的量等于他指向的类型的字节数。
	cout << "Now p_p3[1] is " << p_p3[1] << endl;
	cout << "Now p_p3[2] is " << p_p3[1] << endl;
	p_p3 = p_p3 - 1;
	delete[]p_p3;

 

最后

以上就是追寻火为你收集整理的C++——指针的全部内容,希望文章能够帮你解决C++——指针所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部