【问题标题】:C++ pointer gives error with data type 'int' but works fine with 'char'C++ 指针在数据类型“int”时出现错误,但在“char”时工作正常
【发布时间】:2016-05-16 23:51:23
【问题描述】:

我正在尝试学习 C++ 中的指针和引用。我有以下程序。

#include <iostream>
using namespace std;

int main() {

    // 1st statement / code of block. This portion works fine.
    char *str = "A";
    cout << str << endl;   // it outputs A
    cout << *str << endl;  // it outputs A
    cout << &str << endl;  // it outputs 0x23fe40 (memory location)

    char **b = &str; 
    cout << b << endl;   // it outputs 0x23fe40 (memory location)
    cout << *b << endl;  // it outputs A


    // 2nd statement / code of block. This portion gives error.
    // int *st = 5;
    // cout << st << endl;
    // cout << *st << endl;
    // cout << &st << endl;
    // int **c = &st;
    // cout << c << endl;
    // cout << *c << endl;    

    return 0;
}

代码在这个阶段运行良好。但我运行第二条语句(我在这里评论),编译器给出以下错误。

Invalid conversion from 'int' to 'int*'

有人能解释一下为什么会这样吗?两个语句几乎相同,唯一的区别是我在第二个语句中使用了数据类型“int”。是不是因为数据类型不同?

【问题讨论】:

  • 您希望这种转换如何进行?
  • 它适用于 char。为什么我不应该期待它与 int?
  • 鉴于您期望与5 一起工作,您可能期望"A" 成为char。它不是; IIRC,这是一个const char[2]
  • 我怎样才能使第二条语句起作用?
  • 字符串很特别……它就是这样设计的。诠释* x=5; // 5 存在于内存中的什么位置?它没有 - 它必须放在内存中的某个地方并且 addr 返回......这是为字符串完成的;我不知道为什么它没有为其他数据类型完成......它可能是。我不确定它会有多大用处/它的用途是什么。

标签: c++ pointers


【解决方案1】:

正如人们之前提到的,使用 str 隐式创建一个字符数组,返回的 *char 指针指向内存中的该数组。因此,当您取消引用它时,您会得到字母“A”。

你应该意识到,当你取消引用一个字符串时,你只会得到数组中的第一个字符(返回的指针指向数组中的第一个值)。如果您的字符串是“AB”而不是“A”,*str 将仅返回“A”,而 str 将打印出“AB”。

这不适用于整数变量,因为变量初始化时没有隐式引用。整数是原始的,没有引用就不能取消引用,没有指向的东西就不能检索指针。这就是它无法将整数值转换为指向整数值的指针的原因。

请注意,您仍然可以声明一个包含原始值的变量并获取它的地址(&st 在声明后仍然有效)。如果你想用一个 int 值来玩弄内存取消引用,你可以乱用引用其他变量。例如

int i = 5;
int *st = &i;
int **c = &st;

第一个变量会打印出5,第二个会打印出变量i的地址,第三个会打印出指向变量i的指针地址。

有趣的东西。基本上只是为了感受指针之类的东西而乱来。

【讨论】:

    猜你喜欢
    • 2020-06-01
    • 2021-11-16
    • 1970-01-01
    • 2012-02-07
    • 2011-08-04
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多