zoukankan      html  css  js  c++  java
  • CC++ 如何确定一个变量的类型(恶心的指针)

    如何确定一个变量的类型

    1.如果一个变量声明中没有括号

    如果一个变量声明中没有括号,从右往左读,离变量名最近的修饰符确定这个变量的类型。如果最近的修饰符是指针或引用,那么除了这个修饰符,其余部分(也从右往左读)确定这个指针(引用)指向什么类型。

    int a; //整数类型
    int *p;//从右往左读,第一个修饰符是*,说明p是指针,剩下的修饰符只有int,那么就是指向int的指针
    int **p;//同理解释
    

    如何声明一个数组的指针?注意,数组和指针并不等价,所以数组的指针不是二级指针。

    int arr[10];
    int *parr[10] = &arr; //对吗?
    

    我们从右往左读,第一个遇到的修饰符是[10],说明啥?说明parr是一个数组,剩下还有int*,那就说明,parrint*的数组。所以上述代码会报错。既然从右往左读,那么下边的代码怎么样?

    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与指针》,更加酸爽!

  • 相关阅读:
    MySQL教程22-字符串类型
    MySQL教程21-日期和时间类型
    MySQL教程20-小数类型
    MySQL教程19-整数类型
    MySQL教程18-数据类型简介
    ActiveMQ_topic
    ActiveMQ_消费者编码
    ActiveMQ_生产者编码
    ActiveMQ介绍
    管理docker容器
  • 原文地址:https://www.cnblogs.com/rookiezjz/p/12537123.html
Copyright © 2011-2022 走看看