比如
int i=2, *p=&i;
在c++中,*p
这个表达式的类型是int的引用即int &
,而c中并没有引用这个概念,所以在c中*p
的类型是什么?难道是int
?如果是这样的话太搞了吧
怪我咯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
而不是*p
,p
的类型是指向int类型的指针(int *
)。
②此处的*
是取值操作符,操作/取出p
所指向的地址的值。这和①中定义用的*
完全是两个东西!不要混淆!
③C中&
是取地址符,此句把i
的地址赋给了p
(而不是*p
,把定义和初始化的操作分开就很容易看懂了)
并没有*p
是什么类型的说法,非要说的话,此处p
是指向int类型数据的指针,那么*p
算是int类型吧。
天蓬老师2017-04-17 12:03:00
三种&
的情况有必要区分一下。
int i = 2,
*p = &i;
这里i
类型为int
,p
类型为int*
,*p
类型为int
。
int &a = i;
这里a
的类型也是int
,而并非int&
。
int& someFunc(int &b)
这里b
类型为int&
,函数返回值类型也是int&
。
大家讲道理2017-04-17 12:03:00
当时刚学习C++指针的时候,跟题主有一模一样的困惑。那时我总觉得,对p取内容(即运算符)等于对i取地址,那p本身岂不是指向地址的指针了。或者说,假定和&像+和-一样互为逆运算,如果把*移到右边,不就有两个&了吗。去分析引用的话,更奇怪。。。
实际上,正如zodiacg回答中的黑体字部分说的那样定义指针和引用变量时所使用的*和&纯粹只是个标记,并没有任何取内容和取地址的意思,跟操作符没有任何关系。
也就是说
int i = 2;
int* p = &i;
*i = 0;
int& r = i;
第二行和第三行中的*性质不一样,前者只是一个类型修饰符,而后者是跟+操作符一样的一个操作符,二者没有任何关系,只是标准中这么规定而已。第四行和第二行的&也是同理。
感觉题主思维非常严谨,学C++就是要这样,才能深度地理解每一个语句的意思,才能不被其“坑害”,而更好地去灵活运用它。愿你能爱上C++。
PHP中文网2017-04-17 12:03:00
&
这个符号在“修饰”【类型】和【变量】的时候意思不一样。
&a
是取 a 的地址
int &b = a
是定义一个变量,它是引用(注意这里不是 int &b = &a
)
高洛峰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*.