CC++ 如何确定一个变量的类型(恶心的指针)
如何确定一个变量的类型
1.如果一个变量声明中没有括号
如果一个变量声明中没有括号,从右往左读,离变量名最近的修饰符确定这个变量的类型。如果最近的修饰符是指针或引用,那么除了这个修饰符,其余部分(也从右往左读)确定这个指针(引用)指向什么类型。
int a; //整数类型
int *p;//从右往左读,第一个修饰符是*,说明p是指针,剩下的修饰符只有int,那么就是指向int的指针
int **p;//同理解释
如何声明一个数组的指针?注意,数组和指针并不等价,所以数组的指针不是二级指针。
int arr[10];
int *parr[10] = &arr; //对吗?
我们从右往左读,第一个遇到的修饰符是[10]
,说明啥?说明parr
是一个数组,剩下还有int*
,那就说明,parr
是int*
的数组。所以上述代码会报错。既然从右往左读,那么下边的代码怎么样?
int[10] *parr = &arr;
理论上来讲,这确实是一个数组的指针(从右往左读)。但不幸的是,C/C++语法并不允许这样。那还有没有办法?
2.变量声明中有括号
变量声明中有括号,优先括号内从右往左读,其余的和没有括号的情况一样。
int (*parr)[10] = &arr;//正确
先读括号内,parr
是个指针,剩下的修饰符还有int[10]
(从右往左读),那么parr
就是指向int[10]
的指针。ohhhhhhhhhhhhhhhhhhhhhhhhhhhh!!!!!!!!!!!!!!!!!
3.检测一下(逐渐变态···
请问下边的p和pp是什么类型?
int *(*p)[4];
int (*(*p))[2][3];
首先看括号,确定p
是一个指针。剩下的从右向左读int*[4]
,这是一个数组,数组中的每个元素都是int*
,所以,p
是一个指针,指向一个int*
数组。
再看下一个,好像有点变态······
先看最里边的括号,p
是一个指针,再看外边的括号,除去(*p)
,外边括号里就剩下*
,所以p
是指向指针(命名为t
)的指针。那么t
指向哪里?看剩下的int[2][3]
,结果很清楚了。p->t->二维数组
.
4.总结
总体从右向左看,有括号先看括号里,离变量名最近的修饰符确定了变量的类型。
完。
ps:建议结合我这篇文章看《C++ const与指针》,更加酸爽!
CC++ 如何确定一个变量的类型(恶心的指针)的更多相关文章
- javascript中检测一个变量的类型
/** * 怎么检测一个变量的类型? * 在js中检测对象类型主要有三种:typeof, instanceof, constructor, 这几种都可以检测对象的类型. * 另外还可以适应jQuery ...
- JAVA中如何取得一个变量的类型
class Test {public static void main(String[] args) {int i=1;System.out.println(getType(i));}public s ...
- 判断一个变量的类型Object.prototype.toString.call
var num = 1;alert(Object.prototype.toString.call(num)); // [object Number]var str = 'hudidit.com';al ...
- 【react】利用prop-types第三方库对组件的props中的变量进行类型检测
1.引言--JavaScript就是一个熊孩子 1.1对于JSer们来说,js是自由的,但同时又有许多让人烦恼的地方.javascript很多时候就是这么一个熊孩子,他很多时候并不会像C和java ...
- Python的变量以及类型
1.程序是用来处理数据的,变量就是用来存储数据的 num1 = 100 2.为了更充分的利用内存空间以及更有效率的管理内存,变量是有不同的类型 3.怎样知道一个变量的类型呢? 3.1 在python ...
- Python变量以及类型
变量的定义 在程序中,有时我们需要对2个数据进行求和,那么该怎样做呢? 大家类比一下现实生活中,比如去超市买东西,往往咱们需要一个菜篮子,用来进行存储物品,等到所有的物品都购买完成后,在收银台进行结账 ...
- 前端-JavaScript1-5——JavaScript之变量的类型
5.1 概述 基本类型5种 number 数字类型 string 字符串类型 undefined undefined类型,变量未定义时的值,这个值自 ...
- 自学Python1.7-python变量以及类型
自学Python之路 自学Python1.7-python 变量以及类型 1 变量是什么 变量是容器 2 变量的作用 存储数据到内存 3 为什么要用变量 存储数据方便后面引用 4 变量定义的规范 变量 ...
- Python之变量以及类型
为了更充分的利用内存空间以及更有效率的管理内存,变量是有不同的类型的,如下所示: 怎样知道一个变量的类型呢? 在python中,只要定义了一个变量,而且它有数据,那么它的类型就已经确定了,不需要咱们开 ...
- Javascript如何判断一个变量是数字类型?
isNaN()不能判断一个变量是否为数字类型,isNaN(123)值为false,isNaN('123')值也为false.isNaN() 的实际作用跟它的名字isNaN并不一致,isNaN(NaN) ...
随机推荐
- gateway 是什么?
Gateway 定义是什么? 百度百科解释: 网关(Gateway)又称网间连接器.协议转换器.网关在网络层以上实现网络互连,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连. 网关既可以用于广 ...
- JS Leetcode 33. 搜索旋转排序数组题解,图解旋转数组中的二分法
壹 ❀ 引 本来今天(2021.4.7)的每日一题是81. 搜索旋转排序数组 II,但今天工作很忙,下班人基本累个半死,题目别说按照二分法的思路做不出来,连题解看了会都没法沉下心去看,不过得到的信息是 ...
- Transform LiveData
查询资料的其中一个场景: 创建一个回调函数,当查询后台的时候,后台有结果了,回调对应的回调函数,并将结果保存到LiveData中. public class DataModel { ... ...
- 【Unity3D】表面着色器
1 前言 固定管线着色器一.固定管线着色器二 中介绍了 ShaderLib 的基本用法,本文将接着讲解表面着色器(Surface Shader)的用法.固定管线着色器基于 ShaderLib 命令 ...
- C++ 多线程的错误和如何避免(11)
不要在对时间敏感的上下文中使用 .get() 先看下面的代码, #include "stdafx.h" #include <future> #include <i ...
- [Android 逆向]旅行青蛙破解
1. 旅行青蛙V1.0,4 apk 安装到手机,可以运行 2. jadx 打开apk 存在这两个dll ,说明是 unity开发的 3. 导出Assembly-CSharp.dll, 使用DnSpy ...
- 【Android逆向】frida hook so 函数
1. apk来自52pojie 链接:https://pan.baidu.com/s/1vKC1SevvHfeI7f0d2c6IqQ 密码:u1an 2.apktool反编译apk,拿到so文件 ja ...
- APISIX介绍
APISIX是什么 Apache APISIX是Apache软件基金会下的云原生API网关,它兼具动态.实时.高性能等特点,提供了负载均衡.动态上游.灰度发布(金丝雀发布).服务熔断.身份认证.可观测 ...
- Lua学习笔记之迭代器、table、模块和包、元表和协程
迭代器 迭代器是一种对象,它能够来遍历标准库模板容器中的部分或全部元素,每个迭代器对象代表容器中确定的地址,在Lua中迭代器是一种支持指针类型的结构,他可以遍历集合的每一个元素. 泛型for迭代器 泛 ...
- dart的map方法如何获取index
一.前言 我们常常用dart中的map方法遍历List,但是直接用map,只能取到value,得不到index,这是因为map方法就只给了一个value,map的实现如下图: 下面就看看获取index ...