int x = 4;
int* q = &x; // Is it always equivalent to int *q = &x; ?
cout << "q = " << q << endl; // output: q = 0xbfdded70
int i = *q; // A
int j = *(int*)q; // B, when is this necessary?
cout << "i = " << i << endl; // output: i = 4
cout << "j = " << j << endl; // output: j = 4
我的问题是A行和B行是做什么的,为什么输出都是4?
答案 0 :(得分:3)
它是指针的基本用法,在你取消引用指针(访问指针指向的变量)“:
int i = *q; // A
虽然B完全相同,但它还会将指针转换为相同的类型。你可以这样写:
int j = *q; // B
不需要(int *)
答案 1 :(得分:2)
int x = 4;
x是4
int* q = &x;
q是 x的存储位置(包含4)
cout << "q = " << q << endl; // output: q = 0xbfdded70
你的记忆位置。
int i = *q; // A
i是内存位置q的值
int j = *(int*)q; // B
j是内存位置q的值。 q正被强制转换为int指针,但这就是它已经存在的东西。
答案 2 :(得分:1)
int i = *q; // A
取消引用指针以获取指向值
int j = *(int*)q; // B
type将指针强制转换为int *
,然后取消引用它。
两者都是相同的,因为指针已经指向int。因此,根本不需要在第二种情况下对int *
进行类型转换。
在两种情况下,进一步的derefenecing产生指向的整数变量值。
答案 3 :(得分:1)
线A和B是等价的,因为q已经是int *,因此(int *)q等于q。 int i = * q; yelds我成为q指向的整数的值。如果你想让i等于地址本身,请删除星号。
答案 4 :(得分:1)
答案 5 :(得分:0)
A行获取q
指向的值并将其分配给i
。第b行将q
强制转换为类型int*
(已经是q
的类型,因此强制转换是完全冗余/无意义的),然后获取q指向并赋值的值到j
。
两者都给你4,因为这是q
指向的值。
答案 6 :(得分:0)
行A取消引用指针q
,其类型为int *
,即指针指向int
值。
B行在取消引用之前将q
转换为(int *)
,因此第B行与int j = *q;
相同。