2011-12-30 57 views
1
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?指针上的这个操作是如何工作的?

回答

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指针,但这就是它已经是。

+0

是'*(INT *)问;'必要的我在某些情况下?我想不出一个,但想知道是否有这种可能性。 – qazwsx 2011-12-30 16:45:56

+0

'(int *)q'的意思是“不管q是什么,我想把它当作一个指向int的指针”。当你想要使用数据的位布局做技巧时,这很有用。而且,C语言中的程序通常会将指针实际指向的内容隐藏起来(通过将其指向(void *))。 – 2011-12-30 17:26:12

+0

所以用最简单的术语来说,如果'q'已经不是**或'int *','(int *)q'将是必要的。 – 2011-12-30 17:30:02

1
int i = *q; // A 

取消引用指针,以获得尖锐的价值

int j = *(int*)q; // B 

类型转换指针的int *,然后解引用它。

两者都是相同的,因为指针已经指向一个int。所以在第二种情况下类型转换为int *根本不需要。

在这两种情况下,进一步去除均会产生指向的整型变量值。

1

A和B行是相等的,因为q已经是int *,因此(int *)q等于q。 int i = * q; yelds,我变成了由q指向的整数的值。如果你想让我等同于地址本身,请删除星号。

1

答:Dereference - 需要一个指针的值(变量或对象),并返回值

B:投射到int*和比解引用

结果是相同的,因为该指针是已经到INT。而已。

+0

+1指出费米实验室的没有废话的参考手册 – qazwsx 2011-12-30 16:48:25

0

A行取q指向的值并将其指定给i。 b行将q转换为类型int*(这已经是q的类型,因此转换完全是冗余的/无意义的),然后将q指向的值赋给j

两者都给你4,因为这是q指向的值。

0

行A去引用指针q键入为int *,即指针指向的值为int

B行转换q as (int *)解除引用前,所以B行与int j = *q;相同。

3

它是指针的基本用法,所述的取消引用指针(访问变量到其中指示器分)“:

int i = *q; // A 

而B是做完全一样,但它另外蒙上指针同类型你可以写这样的:。

int j = *q; // B 

没有必要为(int *)