c++ 之重温指针篇

指针 Who are 有?0.0

基本简述:

c++是一种与底层接触较多的语言,而底层无非是内存,每个内存都对应地址。而指针就是一种新的类型,只是他不像int 表示有符号整数,他只是表示的是一串十六进制的地址。在x86下,指针为了能够完全寻址。所以被定义为4个字节,而在x64下,为8个字节!

基本要素:

1、 需要操作的地址
2、 要操作的内存容量

引出语法:

数据类型 * 指针名;
例如: int * pstr ;

定义之困惑:

int* pstr=0, str=0;
int* pstr1 = 0, *str1 = 0;

对比两行:相信很多编程新手可能都不太一眼发现问题所在,但我们看一下第一行和第二行的差别,在于第二个变量是否有*号。究竟要说明什么呢?

代码如下:

cout << typeid(pstr).name() <<" “<< typeid(str).name() << endl;
cout << typeid(pstr1).name()<<” "<< typeid(str1).name() << endl;

结果:

在这里插入图片描述
-------------相信有心人已经发现差别了,虽然是小问题!但却十分得留意!!!-----------------

混淆概念?不存在:

Ⅰ: 数组指针与指针数组

1、指针数组: 本质是数组,举个例子:int型指针数组;它就跟int型数组,short型数组一 样,它是数组,但是每个成员是int*型。

2、数组指针: 本质是指针,他和int型指针,short型指针有什么区别呢?他指的东西大一点而已,他指向一个数组。

代码举例(一看就懂):

扫描二维码关注公众号,回复: 9173227 查看本文章
	int a{ 1 }, b{ 2 }, c{ 3 };  //定义三个变量
	int* pArr[3]{}; //定义指针数组
	pArr[0] = &a; pArr[1] = &b; pArr[2] = &c;//每个成员都是指针而已
	
	int aa[3] = { 1,2,3 }; //定义一个大小3的数组
	int(*Arrp)[3]{};//定义数组指针  
	Arrp = &aa; //它指向一个大小为3的数组

Ⅱ 常量指针、指针常量与指向常量的常量指针

1、常量指针: 本质是指针!与变量指针(自己起的)对应,比如:int指针啦、short指针啦。它是什么呢?常量的指针,常量是什么?const int ,const short 而已;常量能改变?答案是不能,所以不能通过 *变量 = xxx 来改变常量的大小,它能干嘛呢?它可以指向别的常量甚至是变量

2、指针常量: 本质是常量!有int型常量,short型常量;它就是指针型的常量而已。比如:int型指针常量x为int * const x;它有什么特性呢?它指向一个数可以,但却不能改变指向了;但它却可以通过*号改变变量的值

**3、指向常量的常量指针:**满足以上两种特性就是这种

代码范例:

1、常量指针

代码:

	const int str1 = 10; const int str2 = 20; int str3 = 30;
	//定义常量指针 	
	const int* cpstr1{ &str1 }; //*cpstr1 = 5; 都不能修改值
	cout << "cpstr1 = " << *cpstr1 << endl;
	cpstr1 = &str2;  // *cpstr1 = 5; 都不能修改值
	cout << "cpstr1 = " << *cpstr1 << endl;
	cpstr1 = &str3;  // *cpstr1 = 5; 都不能修改值
	cout << "cpstr3 = " << *cpstr1 << endl;

结果:
在这里插入图片描述
总结: 常量指针可指向别的变量或者常量,但是不能通过*号来改变指向地址的值

2、指针常量

代码:

	int str1{ 10 }, str2{ 20 };
	int* const pcstr = &str1;
	cout << "修改前 str1=" << *pcstr << endl;
	//pcstr = &str2; 这句话不可能成功,因为指向了就不能改变了
	*pcstr = 30;
	cout << "修改后 str1=" << str1 << endl;

结果:
在这里插入图片描述
总结: 指针常量只能指向第一个数,之后不能改变指向;可通过*号来修改指向变量的值

3、指向常量的常量指针

代码:

	const int str1{ 10 }; const int str2{ 20 };
	const int* const cpcstr = &str1;
	cout << "str1=" << *cpcstr << endl;
	//*cpcstr = 30; //这句话不可能成功
	//cpcstr = &str2;//这句话也不可能成功

结果:
在这里插入图片描述
总结: 指向后,不能改变指向,也不能通过*号修改指向地址的值,总之就是只读

感谢自己的努力拼搏!!老铁们,觉得说的还有点道理,记得点个赞哦!!!谢谢哦!

发布了8 篇原创文章 · 获赞 9 · 访问量 517

猜你喜欢

转载自blog.csdn.net/u010092716/article/details/104326624