首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个取消引用指针的例子有什么不同?

这个取消引用指针的例子有什么不同?
EN

Stack Overflow用户
提问于 2020-12-02 06:01:34
回答 3查看 46关注 0票数 2

所以我的类有两个例子,不确定为什么一个可以工作,另一个不能。

代码语言:javascript
复制
int numSides = 3;
int *valPointer = &numSides;
PrintValue(valPointer);

打印3。

代码语言:javascript
复制
int numSides = 3;
int* valPointer;
*valPointer = &numSides;
PrintValue(valPointer);

这不起作用,但为什么呢?

课堂笔记说int值不能被赋值为int*

EN

回答 3

Stack Overflow用户

发布于 2020-12-02 06:04:54

代码语言:javascript
复制
int* valPointer;
*valPointer = &numSides;

上面的内容是错误的--您试图将(valPointer-valPointer-points- to的整数)设置为一个地址,这是没有意义的,因为地址和整数(通常来说)是不可互换的。

也许你的意思是这样?

代码语言:javascript
复制
int* valPointer;
valPointer = &numSides;

..。这会将valPointer设置为指向numSides

票数 1
EN

Stack Overflow用户

发布于 2020-12-02 06:10:05

The program

代码语言:javascript
复制
void PrintValue(int*);

void f() {
  int numSides = 3;
  int *valPointer;
  *valPointer = &numSides;
  PrintValue(valPointer);
}

编译结果:

当当:

代码语言:javascript
复制
<source>:6:17: error: incompatible pointer to integer conversion assigning to 'int' from 'int *'; remove &
  *valPointer = &numSides;
                ^~~~~~~~~
1 error generated.
Compiler returned: 1

Gcc:

代码语言:javascript
复制
<source>: In function 'void f()':
<source>:6:17: error: invalid conversion from 'int*' to 'int' [-fpermissive]
    6 |   *valPointer = &numSides;
      |                 ^~~~~~~~~
      |                 |
      |                 int*
Compiler returned: 1

Microsoft编译器:

代码语言:javascript
复制
example.cpp
<source>(6): error C2440: '=': cannot convert from 'int *' to 'int'
<source>(6): note: There is no context in which this conversion is possible
Compiler returned: 2

每个编译器都会以自己的方式在错误消息中说明问题所在。

  • 指向整数转换的不兼容指针从'int*‘赋值给'int’
  • 从'int *‘到'int’的无效转换
  • 无法从‘int*’转换到'int'

Clang甚至给出了一个建议:

  • remove '&'

这不一定是正确的。

票数 0
EN

Stack Overflow用户

发布于 2020-12-02 06:16:46

int *valPointer = &numSides;

它声明了一个int *类型的变量valPointer,并在其中存储了numSides的地址。

int * valPointer;*valPointer= &numSides;

这将声明一个类型为int *的变量valPointer,但不会将其初始化为指向任何特定位置。它包含的地址就是堆栈上发生的任何垃圾。然后,它解除对valPointer的引用,这是一个错误,因为valPointer从未初始化过,并尝试将numSides的地址存储在该位置。

我认为你需要的要点是,当单独使用时(例如*valPointer),*用于解除对指针的引用,但当在声明中使用时(例如int *valPointer),它是类型的一部分。另外,请注意,在声明中使用类型和*之间是否有空格或*和变量之间是否有空格并不重要;也就是说,int *fooint *foo的含义是一样的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65099191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档