提问者:小点点

C++中带有cout的指针


我正在学习C++,当我试图打印一个数组的内容时,我遇到了一些困惑。 我有一个数组,其中有两个值,2和3。 当我想打印如下值时:

int* test = myApp.countDivisions(5);
std::cout << "Horizontal: " << *test<< std::endl;
std::cout << "Vertical: " << *(test+1) << std::endl;

我得到:

Horizontal: -858993460
Vertical: -858993460

但当我写到:

int* test = myApp.countDivisions(5);
int foo = *(test);
int boo = *(test+1);
std::cout << "Horizontal: " << foo << std::endl;
std::cout << "Vertical: " << boo << std::endl;

我得到:

Horizontal: 2
Vertical: 3

我不明白为什么会发生这种事。 如果有人能解释为什么会发生这种行为,那就太好了! 我知道我不应该在C++中使用C数组,但是我仍然有兴趣了解这里发生了什么!

编辑:我在第一个示例中修改了一个错误


共1个答案

匿名用户

我认为打印*int是一种未定义的行为--它有点没有意义。 此表达式是一个类型。 这有点像说“here is human”而不是“where is the human call bob”(好吧,有点垃圾的类比),类型本身没有地址。

第二个示例int*test是一个名为test的变量,其类型为int*(指向整数的指针)。 您将指针test的值设置为某个对象(无论MyApp.CountDivisions(5);返回什么-您应该告诉我们返回什么)。

那么:

int foo = *(test);
int boo = *(test+1);

foo是一个整数变量,您将其设置为测试指向的值--而不是地址本身。 BOO设置为下一个地址的内容(测试的地址+1)。

如果要打印指针的地址,则应执行以下操作:

std::cout << "Horizontal: " << test << std::endl;

如果要打印指针所指向的值,则应执行以下操作:

std::cout << "Horizontal: " << *test << std::endl;

这称为取消引用。 请参阅以下小示例:https://godbolt.org/z/czhbq6

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|带有|cout|指针)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?