c++ - 在C中,int *p的*p是什么类型?
PHP中文网
PHP中文网 2017-04-17 12:01:00
0
7
1002

比如

int i=2, *p=&i;

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

PHP中文网
PHP中文网

认证0级讲师

répondre à tous(7)
刘奇
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类型吧。

Peter_Zhu

p的类型是pointer

阿神

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

Peter_Zhu

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

int i = 2, 
    *p = &i;

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

int &a = i;

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

int& someFunc(int &b)

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

大家讲道理

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

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

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

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

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

洪涛

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

  • &a 是取 a 的地址

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

小葫芦

你的概念错的离谱,不过我先不想讲 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*.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal