指针上的这个操作如何工作?

时间:2011-12-30 16:20:46

标签: c++ pointers

  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?

7 个答案:

答案 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)

A:Dereference - 获取指向值(变量或对象)的指针并返回值

B:转为int*而不是取消引用

结果是一样的,因为指针已经是int。就是这样。

答案 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;相同。