小编MmM*_*sSs的帖子

澄清数组和指针的关系

我想要进一步了解,并可能澄清一些让我对 C++ 中的数组和指针感到困惑的事情。让我困惑的主要事情之一是,当您引用数组的名称时,它可能是指该数组,或者是指向第一个元素的指针,以及其他一些东西。为了更好地显示我的理解困难来自哪里,我将显示几行代码,以及我从每行代码中得出的结论。

假设我有

  int vals[] = {1,50,3,28,32,500};
  int* valptr = vals;
Run Code Online (Sandbox Code Playgroud)

因为 vals 是指向数组第一个值的指针,所以这意味着 valptr 作为一个整体应该等于 vals,因为我只是将一个指针设置为等于一个指针,例如 1=1。

cout<<vals<<endl;
cout<<&vals<<endl;
cout<<*(&vals)<<endl;
cout<<valptr<<endl;
Run Code Online (Sandbox Code Playgroud)

上面的代码打印出相同的值,这让我得出两件事的结论,一是 valptr 和 vals 相等,并且可以以相同的方式处理,另一个事实是,由于某种原因,将 & 和 * 添加到vals 似乎没有指代任何不同的东西,这意味着以这种方式使用它们是没有用的,因为它们都指的是相同的值。

cout<<valptr[1]<<endl;//outputs 50
cout<<vals[1]<<endl;//outputs 50
cout<<*vals<<endl;//outputs 1
cout<<*valptr<<endl;//outputs 1
Run Code Online (Sandbox Code Playgroud)

上面的代码进一步加深了我的心态,valptr 和 vals 是相同的,每当我对 vals 执行某些操作,并对 valptr 执行相同的操作时,它们都会产生相同的结果

cout<<*(&valptr +1)-valptr<<endl;


cout<<endl;

cout<< *(&vals + 1) -vals<<endl;
Run Code Online (Sandbox Code Playgroud)

现在我们已经确定了我所知道的,或者我可能有的误解,现在我们继续讨论我遇到的两个主要问题,我们现在将讨论这些问题。

我的第一个困惑是cout<< *(&vals + 1) -vals<<endl;我知道这输出了数组的大小,以及它如何工作的一般概念,但我对几个部分感到困惑。如前所述,如果

cout<<vals<<endl;
cout<<&vals<<endl;
cout<<*(&vals)<<endl;
Run Code Online (Sandbox Code Playgroud)

全部打印出相同的值,为什么我需要 * 和 & ,cout<< *(&vals + 1) -vals<<endl;我知道如果我这样做,vals+1 …

c++ arrays pointers

1
推荐指数
1
解决办法
129
查看次数

布尔函数返回 24,并且在多个编译器中表现不一致

好吧,这让我抓狂,我不知道发生了什么。我正在为学校编写一些代码,它基本上接受一个字符串以及一个开始和结束索引,如果该字符串是回文,则输出 true,如果不是,则输出 false。我添加了一些额外的东西,以确保它可以工作,如果你给它一个带有空格和标点符号的句子,除了一个小的逻辑错误,如果中间两个字母不同,它会返回 true,它可以工作......几乎。它有一个超级有趣的错误,它似乎在不同的编译器上表现不同。在 repl.it 上,我stack smash detected基本上会收到任何输入的消息,但对于某些内容,例如输入,Hello, World!我会收到分段错误。当我在 Visual Studios 2019 上运行它时,它会为每个错误输入返回 24,我什至不知道布尔值如何返回类似 24 之类的东西,但如果我将函数从 type 更改为booltype int,那么它就可以完美工作......除了 repl.it,我仍然会遇到堆栈崩溃问题。我也不想把它留在 int 上然后就到此为止了,因为这感觉就像创可贴,到底发生了什么?

太棒了;在 Visual Studio 上布尔函数返回 24,在其他版本上堆栈粉碎,将函数返回类型更改为 int 而不是 bool 在 Visual Studio 上修复了该问题,但在其他版本上则不然。

#include <iostream>
#include <string>

using namespace std;

bool isPalindrom(string, int, int);

int main() {

  string str = "R aceCar";// should return true
  bool thing = isPalindrom(str,0,str.length()-1);
   cout << thing << endl;


}

bool isPalindrom(string str, int start, int end){ …
Run Code Online (Sandbox Code Playgroud)

c++ recursion

-1
推荐指数
1
解决办法
93
查看次数

标签 统计

c++ ×2

arrays ×1

pointers ×1

recursion ×1