C ++指针给出数据类型错误' int'但与#char;#'

时间:2016-05-16 23:51:23

标签: c++ pointers

我试图用C ++学习指针和参考。我有以下程序。

AndroidManifest.xml

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

#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;
}

有人可以解释为什么会这样吗?这两个陈述几乎相同,唯一的区别是我使用了数据类型&#39; int&#39;在第二个声明中。是因为数据类型不同吗?

1 个答案:

答案 0 :(得分:2)

正如前面提到的那样,用str隐式创建一个字符数组,返回的* char指针指向内存中的那个数组。因此,当你取消引用它时,你会收到#34; A&#34;。

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

这对整数变量不起作用,因为没有隐式引用变量正在初始化。整数是一个原语,你不能在没有引用的情况下取消引用,并且你无法在没有指向的东西的情况下检索指针。这就是它无法将整数值转换为指向整数值的指针的原因。

请注意,您仍然可以声明一个包含原始值的变量并获取它的地址(&amp; st在声明后仍然有效)。如果你想使用int值来解释内存解除引用,你可以搞砸引用其他变量。 E.g。

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

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

有趣的东西。基本上只是乱七八糟地感受指针等等。