搜索

首页  >  问答  >  正文

c++ - 在C中,int *p的*p是什么类型?

比如

int i=2, *p=&i;

在c++中,*p这个表达式的类型是int的引用即int &,而c中并没有引用这个概念,所以在c中*p的类型是什么?难道是int?如果是这样的话太搞了吧

PHP中文网PHP中文网2804 天前996

全部回复(7)我来回复

  • 怪我咯

    怪我咯2017-04-17 12:03:00

    int i=2;
    int * p=&i; // ①int* p和int *p都一样
    

    其中后一句又等同于

    int * p;
    p = &i; //③
    

    再加上一句代码方便说明:

    *p = 23; //②此时i也等于23
    

    ①通过int * p定义出来的是p而不是*pp的类型是指向int类型的指针(int *)。
    ②此处的*是取值操作符,操作/取出p所指向的地址的值。这和①中定义用的*完全是两个东西!不要混淆!
    ③C中&是取地址符,此句把i的地址赋给了p(而不是*p,把定义和初始化的操作分开就很容易看懂了)

    并没有*p是什么类型的说法,非要说的话,此处p是指向int类型数据的指针,那么*p算是int类型吧。

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-17 12:03:00

    p的类型是pointer

    回复
    0
  • 阿神

    阿神2017-04-17 12:03:00

    *p某种意义上算是int &p 间接引用

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-17 12:03:00

    三种&的情况有必要区分一下。

    int i = 2, 
        *p = &i;
    

    这里i类型为intp类型为int**p类型为int

    int &a = i;
    

    这里a的类型也是int,而并非int&

    int& someFunc(int &b)
    

    这里b类型为int&,函数返回值类型也是int&

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-17 12:03:00

    当时刚学习C 指针的时候,跟题主有一模一样的困惑。那时我总觉得,对p取内容(即运算符)等于对i取地址,那p本身岂不是指向地址的指针了。或者说,假定和&像 和-一样互为逆运算,如果把*移到右边,不就有两个&了吗。去分析引用的话,更奇怪。。。

    实际上,正如zodiacg回答中的黑体字部分说的那样定义指针和引用变量时所使用的*和&纯粹只是个标记,并没有任何取内容和取地址的意思,跟操作符没有任何关系
    也就是说

    int i = 2;
    int* p = &i;
    *i = 0;
    int& r = i;

    第二行和第三行中的*性质不一样,前者只是一个类型修饰符,而后者是跟 操作符一样的一个操作符,二者没有任何关系,只是标准中这么规定而已。第四行和第二行的&也是同理。

    感觉题主思维非常严谨,学C 就是要这样,才能深度地理解每一个语句的意思,才能不被其“坑害”,而更好地去灵活运用它。愿你能爱上C 。

    回复
    0
  • PHP中文网

    PHP中文网2017-04-17 12:03:00

    & 这个符号在“修饰”【类型】和【变量】的时候意思不一样。

    • &a 是取 a 的地址

    • int &b = a 是定义一个变量,它是引用(注意这里不是 int &b = &a

    回复
    0
  • 高洛峰

    高洛峰2017-04-17 12:03:00

    你的概念错的离谱,不过我先不想讲 p 的类型是 int*,因为拉个二年级小学生都知道,我想说怎么理解 C style 的类型定义。

    以题目中为例,读懂这个类型就像是解方程 int *p 表示 *p 的类型是 int,既然 p 指向一个 int,那么 p 就是一个储存一个 int 型变量的地址的变量。这个太简单了,所以上一点稍微复杂的:char*(*p[10])(int**),开始「解方程」(a : t 表示 a 的类型是 t):

    char*(*p[10])(int**)
    => p : char*(*[10])(int**)
    => p[0..9] : char*(*)(int**)
    => *(p[0..9]) : char*(int**)

    已经推出结果,p 是一个 0 -> 9 的数组,其中储存的是指针,且该指针指向一个函数,函数的类型为 char*(int**) 即为 int** => char*.

    回复
    0
  • 取消回复