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