Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针上的这个操作是如何工作的?_C++_Pointers - Fatal编程技术网

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

C++ 指针上的这个操作是如何工作的?,c++,pointers,C++,Pointers,我的问题是A行和B行做什么,为什么输出都是4 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

我的问题是A行和B行做什么,为什么输出都是4

  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
取消引用指针以获取指向的值

int i = *q; // A
类型将指针强制转换为int*,然后取消引用它

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

在这两种情况下,进一步取消限制会产生定点整变量值

取消引用指针以获取指向的值

int i = *q; // A
类型将指针强制转换为int*,然后取消引用它

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


进一步取消限制在这两种情况下都会产生定点整变量值。

行A和B是等效的,因为q已经是int*了,因此int*q等于q。
int i=*q;使i成为q指向的整数的值。如果你想使i等于地址本身,就去掉星号。

行A和B是等价的,因为q已经是int*了,因此int*q等于q。 int i=*q;使i成为q指向的整数的值。如果要使i等于地址本身,请删除星号。

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

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

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

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

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


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

行A获取q指向的值并将其分配给i。第b行将q强制转换为int*类型,int*类型已经是q的类型,因此强制转换是完全冗余/无意义的,然后获取q指向的值并将其分配给j


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

行A取q指向的值,并将其分配给i。第b行将q强制转换为int*类型,int*类型已经是q的类型,因此强制转换是完全冗余/无意义的,然后获取q指向的值并将其分配给j

int j = *(int*)q; // B
两者都给你4,因为这是q指向的值

int j = *(int*)q; // B
x是4

  int x = 4;
q是x的存储位置,其中包含4

  int* q = &x;
i是内存位置q处的值

  int i = *q; // A
j是存储位置q处的值。q被转换为int指针,但它已经是这样了

x是4

  int x = 4;
q是x的存储位置,其中包含4

  int* q = &x;
i是内存位置q处的值

  int i = *q; // A

j是存储位置q处的值。q被强制转换为int指针,但它已经是了。

行类型为int*的反引用指针q,即指向int值的指针


行B在取消引用之前将q转换为int*,因此行B与int j=*q;相同

行类型为int*的反引用指针q,即指向int值的指针


行B在取消引用之前将q转换为int*,因此行B与int j=*q;相同

这是指针的基本用法,在取消引用指针时,您可以访问指针指向的变量:

  int j = *(int*)q; // B
虽然B执行完全相同的操作,但它还将指针强制转换为相同的类型。你可以这样写:

int i = *q; // A

不需要int*

这是指针的基本用法,在取消引用指针访问指针指向的变量时:

  int j = *(int*)q; // B
虽然B执行完全相同的操作,但它还将指针强制转换为相同的类型。你可以这样写:

int i = *q; // A
不需要int*

is*int*q;在某些情况下有必要吗?我想不出一个,但想知道是否有这种可能性。int*q意味着无论q是什么,我想把它当作指向int的指针。当你想对数据的位布局做一些技巧时,它很有用。此外,C语言中的程序通常会通过将指针强制转换为void*,来隐藏指针实际指向的内容。因此,用最简单的术语来说,如果q不是int*,则int*q是必需的。is*int*q;在某些情况下有必要吗?我想不出一个,但想知道是否有这种可能性。int*q意味着无论q是什么,我想把它当作指向int的指针。当你想对数据的位布局做一些技巧时,它很有用。此外,C语言中的程序通常会通过将指针强制转换为void*,来隐藏指针实际指向的内容。因此,用最简单的术语来说,如果q不是int*,则int*q是必需的。