返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一起来练习C++的指针
  • 832
分享到

一起来练习C++的指针

2024-04-02 19:04:59 832人浏览 泡泡鱼
摘要

目录练习一:一级指针指向练习题练习二:二级指针指向练习题A选项;B选项;C选项;D选项;E选项;总结在c++中,const作用于指针时,可以看做是对指针权限的限制。这里我们先把指针的

c++中,const作用于指针时,可以看做是对指针权限的限制。这里我们先把指针的权限归为两种,分别为指向权限修改权限。(ps:以上是为了理解方便,实际并没有如此规定)

	int a = 10, b = 20;
	int* p = &a;
	p = &b;		// 改变指向的权限  ✔
	*p = 30;	// 修改内存的权限  ✔
	const int* cp = &a;	// 限制修改权限
	/
	int* const p2 = &a;
	int* q2 = p2;
	
	int* const p3 = &a;
	int* const q3 = p3;
	
	int* const p4 = &a;
	const int* q4 = p4;
	

练习二:二级指针指向练习题

题目二:下列表达式语句错误的有。

// 选项A
int a = 10;
int* p1 = &a;
const int** q1 = &p1;	
// 选项B
int a = 10;
int* p2 = &a;
int* const* q2 = &p2;
// 选项C
int a = 10;
int* p3 = &a;
int** const q3 = &p3;
// 选项D
int a = 10;
int* const p4 = &a;
int** q4 = &p4;	
// 选项E
int a = 10;
const int* p5 = &a;
int* const* q5 = &p5;	

答案:(鼠标选中查看)

?错误:A、D、E,正确:B、C?

A选项;

错误; 注:如果const修饰的是二级指针,我们需要对二级指针的逐层解引用进行分析。

	int* p1 = &a;
	const int** q1 = &p1;	//error  无法从“int * *”转换为“const int** ”

int* p1 = &a; p1的类型为int* 取地址为 int **const int** q1 = &p1; q1的类型为 const int **则指针赋值过程为 const int ** <= int* *

分析:

  • const作用于(**q1),修饰二级指针。表示不可通过q1对 a 的值进行修改。
  • *q1 解引用一次后,为一级指针,即 p1 。但是 p1 存在对 a 修改的风险,因此无法直接赋值。

修改方案:

  • 方案一:直接限定一级指针p1。保证p1不会修改a的值,即const int * p1= &a; const int** q1 = &p1;
  • 方案二:间接限定q1,使其指向时缩小权限,对解引用后的(*q1)修改的权限做出限制,如:const int * const * q1;
	// 方案一
	const int* p12 = &a;
	const int** q12 = &p12;

	// 方案二
	int* p11 = &a;
	const int* const* q11 = &p1;

B选项;

正确; 注:如果const修饰的是一级指针,我们可以抛开二级指针的表象,但看一级指针的赋值操作是否正确。如本例。

	int* p2 = &a;			
	int* const* q2 = &p2;
	

C选项;

正确; 注:如果两边类型相同,则无需进行判断。如本例。

	int* p3 = &a;
	int** const q3 = &p3;
	cout << typeid(q3).name() << endl;	//输出 q3 类型   int * *
	

ps:如果const修饰的参数右边无“*”号,则该cosnt不作用于类型。如:

	int n = 10;
	// 使用typeid(valtypr).name() 输出变量类型
	int const* p1 = &n;		// int const *
	int* const p2 = &n;		// int *			// 忽略const
	int* p = &n;
	int** q = &p;
	//int const** q1 = &p;		
	int const* const* q1 = &p;	   // int const* const*
	int* const* q2 = &p;		   // int* const*
	int** const q3 = &p;		   // int**		// 忽略cosnt

D选项;

错误; 同B选项相同,对于const修饰的一级指针进行判即可。

	int* const p4 = &a;
	int** q4 = &p4;			//error  "int *const *"类型的值不能用于初始化"int **类型的实体

int* const p4 = &a; 类型为 int*,因为const的存在,取地址后类型为 int * const *int** q4 = &p4; 类型为 int**则指针赋值过程为 int** <== int* const*

分析:

  • const作用于(p4),修饰一级指针。则我们忽略没有const修饰的部分。即* <== const* ,//忽略 int 部分,该部分赋值时权限没有发生变化。int* <== int const * ,给指针确定一个类型,如“int” 类型
  • 如?,我们可以看到,该表达式语句想从int const* 类型处,获得一个 int* 类型的赋值,也就是说这是权限放大式的赋值。错误原因:该赋值会使得 int* 类型指针对常量(int const* 所指向的值)产生修改的风险。

修改方案:

  • int* <== int const *型赋值改成 int const* <== int const *类型赋值即,int*const* q4 = &p4; 

E选项;

错误; 注:如果赋值两边都有const时,各论各的分析,如下。

	const int* p5 = &a;
	int* const* q5 = &p5;	//error  无法从"const int **"转换为"int *const *"

分析:

  • 省略分析过程等赋值类型为 int* const* <== const int* *
  • 分情况分析:
    • 提取指针左边部分int* <== const int* ,错误 ✖
    • 提取指针右边部分cosnt * <== * 即 int const * <== int *,正确 ✔
  • 综上,错误 ✖。

修改方案:

1.修改指针左边类型:int* <== const int* ⇒ int* <= int*

2.修改指针左边类型:int* <== const int* ⇒ const int* <= const int*

	//1 int* <= int*
	int* p51 = &a;					// const int* p5  ⇒   int* p51
	int* const* q51 = &p51;
	//2 const int*  <= const int*
	const int* p52 = &a;
	const int* const* q52 = &p52;	// int* const* q5 ⇒   const int* const* q52

方法总结:

对于二级指针的赋值操作判断,看const位置、主要有以下两种情况:

  • 如果 const修饰的是二级指针 如:
    • int const ** ,如选项A。我们需要考虑其解引用情况。cosnt修饰二级指针所指向的值为常量,但是由于一次解引用后的指针会存在修改常量的风险,因此我们需要限制该指针与常量之间进行过度的一级指针
    • 针对此类二级指针,我们只需记住合法的赋值为等式两边需同时有const ,const int* cosnt* <== int**或 左边等式有两个cosnt ,const int* cosnt* <== int** 。
  • 如果 const修饰的是一级指针其他 如:

1.const修饰的是一级指针int * const *,如选项B。单独剥离出含cosnt类型的一级指针类型进行分析

2.即修饰一级指针又修饰二级指针 如, int cosnt * cosnt *

3.无const修饰 如, int** 或 int ** cosnt,如选项C、选项D

  • 针对此类二级指针,通过一级指针的比较进行比较即可。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!   

--结束END--

本文标题: 一起来练习C++的指针

本文链接: https://lsjlt.com/news/141716.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一起来练习C++的指针
    目录练习一:一级指针指向练习题练习二:二级指针指向练习题A选项;B选项;C选项;D选项;E选项;总结在C++中,const作用于指针时,可以看做是对指针权限的限制。这里我们先把指针的...
    99+
    2024-04-02
  • 一起来学习C++中类的this指针以使用
    目录一,this指针的注意点错误用例:二,this指针存在哪里三,this指针的面试坑题总结c++的类中,非静态的成员函数都有一个隐藏的this指针,在函数体中所以的成员变量都是通过...
    99+
    2024-04-02
  • 一起来了解一下C++中的指针
    目录1指针的基本概念2指针变量的定义和使用3指针所占内存空间4空指针和野指针5const修饰指针6指针和数组7指针和函数8指针、数组、函数总结1 指针的基本概念 作用:可以通过指针间...
    99+
    2024-04-02
  • 一起来学习C++的函数指针和函数对象
    目录函数指针函数对象总结函数指针 以下是<cstdlib>库中的一个排序数组的方法qsort()的函数原型。 void qsort (void* base, size_t...
    99+
    2024-04-02
  • 让我们一起来对C语言指针再分析
    目录初次认识指针,我们大概了解到一下知识。第一站 字符指针----存放字符地址的指针1.使用方法2. 指针数组----存放指针的数组3. 数组指针 3....
    99+
    2024-04-02
  • 一起聊聊C++中的智能指针
    目录一:背景二:关键词解析1. auto_ptr2. auto_ptr 多引用问题一:背景 我们知道 C++ 是手工管理内存的分配和释放,对应的操作符就是 new/dele...
    99+
    2024-04-02
  • 一起来学习C++的构造和析构
    目录1. 构造函数 1.1 构造函数长什么样子1.2 构造函数干嘛的1.3 思考2. 析构函数2.1 析构函数长什么样子2.2 析构函数用来干嘛(什么时候需要自己手动写析构...
    99+
    2024-04-02
  • 一起来学习C#的观察者模式
    using System; using System.Collections.Generic; public class Example { public static vo...
    99+
    2024-04-02
  • C语言指针类型与野指针引起的原因
    目录一、指针是什么二、指针和指针类型1.指针±整数2.指针解引用三.野指针1.引起野指针的原因2.如果避免野指针一、指针是什么 指针也就是 内存地址 ,在计算机上我们访...
    99+
    2023-02-11
    C语言指针类型 C语言野指针
  • 一起来学习C++中remove与erase的理解
    目录erase简介remove简介代码示例代码分析remove是如何工作的?remove的工作流程总结erase 简介 vector 中 erase 函...
    99+
    2024-04-02
  • 一起来学习C++的动态内存管理
    目录1.new和delete2.new和delete在底层是怎么实现的:2.1new底层的实现: 我们先来new一个test类型的空间。2.2delete底层的实现: 我们执行del...
    99+
    2024-04-02
  • C++指针学习详解
    目录指针的基本概念一、指针变量的定义和使用二、指针所占的空间内存1.空指针 野指针2. const修饰指针利用指针访问数组中的每个元素.总结指针的基本概念 指针的作用:可以通过指针间...
    99+
    2024-04-02
  • 一起来学习TypeScript的类型
    目录前言一、类型声明 二、类型1.number2.string3.boolean 4.字面量 5.联合类型 6.any 7.unkn...
    99+
    2024-04-02
  • 一起来学习Python的列表
    目录列表更多的方法列表的嵌套总结列表更多的方法 index():返回指定数据所在位置的下标 (注意:如果查找的数据不存在则报错。)。count():统计指定数据在当前列表中出现的次数...
    99+
    2024-04-02
  • 一起来学习C语言的输入和输出
    目录一、scanf() 和 printf() 函数实例二、getchar() 和 putchar() 函数实例1实例2三、gets() 和 puts() 函数实例...
    99+
    2024-04-02
  • 一起来学习JavaScript的BOM操作
    目录window对象全局作用域常见事件调节窗口大小定时器setTimeoutthis指向问题location对象转跳页面location常见方法总结window对象 BOM的核心对象...
    99+
    2024-04-02
  • 一起来学习JAVA的运算符
    目录一、赋值运算符二、复合赋值运算符三、算数运算符四、关系运算符五、自运算符六、逻辑运算符七、条件运算符(三元运算符)总结运算符优先级表: 一、赋值运算符 运算符:【=】 含义:把...
    99+
    2024-04-02
  • 一起来学习JavaIO的转化流
    目录Java IO 转化流乱码引起转换流读取乱码转换流介绍InputStreamReaderOutputStreamWriter总结Java IO 转化流 乱码引起转换流 读取乱码 ...
    99+
    2024-04-02
  • 一起来学习Vue的组件化
    目录背景定义分类优势首屏加载优化组件之间的关系总体上可以分为两大类:常见使用场景可以分为三类:总结说起组件化,我毕设写的就是和组件化相关的。 当时还拿了优,运气! 话不多说,直接...
    99+
    2024-04-02
  • Python中的集合一起来学习一下
    目录一、什么是集合二、集合的创建方式三、集合的相关操作3.1集合元素的判断操作3.2集合元素的新增操作3.3集合元素的删除操作四、集合之间的关系五、集合的数学操作六、集合生成式总结一...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作