C++数组未声明的标识符错误

标签 c++ arrays

我只是一个纯粹的 C 用户。

我正在尝试使用 C++ 实现。 但是我很难理解数组的意义。

代码

问题1

...
float *input = read_file(arg[1], ..);
for(;)
{
  float *buf = input;
  buf[c] = 1;
}

for(;)
{
  buf[c] = 1;
}  

正如您在上面的代码中看到的,不存在 buf 声明。 但是有像这个'buf'未声明的标识符这样的错误。 我不明白为什么会出错? 我是否必须每次都声明标识符?

问题2

...
float *input = read_file(arg[1], ..);
for(;)
{
  float *buf = input;
  buf[c] = 2;
}

for(;)
{
  float *buf = input;
  buf[c] = 1;
}  

如果我修改了第一个 buf 数组的值,那么修改后的数组值会影响到第二个 buf 数组。我不明白。我有一个新的 declare buf at second for sentence 但修改后的值仍然影响到 second buf 数组。

最佳答案

您应该了解作用域在 C/C++ 中的工作原理。在作用域中声明的变量仅在该作用域和内部作用域内可见。在您的情况下,您在第一个 for 循环的本地范围内声明 buf 。它在其他 for 范围内不可见,因为范围是不同的。如评论中所述,您需要使变量对两个 for 范围都可见。唯一的解决方案:在 for 循环的外部范围内声明它。

编辑

您问过为什么可以通过在局部范围内可见的变量修改 input。那么,您的变量是一个指向 input 的指针 float* buf。后者在作用域外声明,所以它对两个 for 循环都是可见的(它们的作用域是封闭的,所以它们看到“外部世界”)。因此,您可以通过本地指针访问它,并相应地修改它。

经验法则:从你的房子里你可以看到世界,但世界看不到你的房子里面(至少,如果你小心的话,C/C++ 编译器非常小心)。

关于C++数组未声明的标识符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30114607/

相关文章:

c++ - Arduino sprintf float 未格式化

c++ - boost::asio 计时器的线程安全工作

c++ - 在 C++ 类中处理多个状态

php - PDO 比较两个不同格式的数组

javascript - 循环访问对象数组中的用户数据

arrays - 手动展开 3 个嵌套循环 (Julia)

java - 在java中用单独的矩形渲染等轴测图

c++ - 使用 vector<char> 作为缓冲区而不在 resize() 上初始化它

c++ - 第一个包无法使用非阻塞 tcp 套接字发送

c - 通过硬编码地址制作指向结构的指针数组时避免 gcc 警告