我试图用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;在第二个声明中。是因为数据类型不同吗?
答案 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的指针的地址。
有趣的东西。基本上只是乱七八糟地感受指针等等。