这个带有向量的简单代码有什么问题?
What is wrong with this simple code with vectors?
下面的代码是我为自己编写的代码,用于测试指针和向量的工作原理。
我对C++很陌生。
#include <vector>
#include <iostream>
using namespace std;
int main(void)
{
//Create the integer pointer vector, and clean it to initialize
vector<int *> lol;
lol.clear();
//Create the pointers and point them to 1,2,3
int a1=1, a2=2, a3=3;
int* a, b, c;
a=&a1;
b=&a2;
c=&a3;
//Put the pointers into the vector
lol.push_back(a);
lol.push_back(b);
lol.push_back(c);
//Return the value of the middle pointer
cout << *lol[1];
}
我在编译时遇到一整堵错误墙。
谁能帮忙?请记住,我只能理解新手。
问题出在以下行上:
int* a, b, c;
a
是int*
,但b
和c
只是int
。
int *a, *b, *c;
会让这一切都int*
s。
int* a;
int* b
int* c;
做同样的事情,但更明确的意图是声明三个int*
。
请参阅:在指针声明中放置星号
更新:甚至更好:
int* a = &a1;
int* b = &a2;
int* c = &a3;
只要有可能,就不要将变量初始化及其声明分开。
在一行上声明多个指针时,必须在每个指针变量前面指定 * 符号。
int * a, b, c;
应该是 :
int *a, *b, *c;
行 :
int * a, b, c;
解释为:
int *a;
int b;
int c;
如果声明变量,请不要在同一行上声明多个变量。
你认为你所做的是声明三个指向 int 的指针。你所做的是声明三个整数,其中一个是指针:
int* a, b, c;
方法
int *a; int b; int c;
将 * 视为属于变量名称。不直观,但这就是语言的工作方式。
您希望将所有三个声明为指针:
int* a;
int* b;
int* c;
更改此内容
int* a, b, c;
自
int *a, *b, *c;
在您的声明中,您正在声明
a as pointer to int
b as int
c as int
正如其他人已经指出的那样,主要问题是这里的定义:
int* a, b, c;
基本上,只有a
是int *
;b
和c
只是int
秒。
最好每行有一个变量定义:
int* a = &a1;
int* b = &a2;
int* c = &a3;
如果您使用这些原始指针,并且由于某种原因您想先定义它们,然后再分配它们的值,请考虑至少将它们初始化为nullptr
(如果您使用的是 C++98/03,则NULL
):
// Initialize to NULL/nullptr, to avoid pointers pointing to junk memory
int* a = nullptr;
int* b = nullptr;
int* c = nullptr;
....
// assign proper values to pointers...
此外,还可以为您的代码做其他注释:
int main(void)
由于这是C++-而不是C- 您可以省略(void)
,而只使用()
:
int main()
创建vector
时:
vector<int *> lol; lol.clear();
不需要在向量定义后调用其clear()
方法:事实上,vector 的默认构造函数(在第一行定义向量时由编译器隐式调用)已经将向量初始化为空向量。
这很好:
vector<int *> lol; // Creates an empty vector
考虑到这些注释,您的代码可以编写如下:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int *> lol;
int a1 = 1;
int a2 = 2;
int a3 = 3;
int * a = &a1;
int * b = &a2;
int * c = &a3;
lol.push_back(a);
lol.push_back(b);
lol.push_back(c);
cout << *lol[1] << endl;
}
第一个问题是指针的声明
int* a, b, c;
这将创建 a 作为指针和 b & c 作为 int。
使用声明,例如
int* a,*b,*c;
在访问矢量元素时,使用 .at() 矢量方法。
cout << *lol.at(0) << endl;
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 0-1背包代码中的错误.我的代码中有什么错误
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 这行代码在C++类中意味着什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 此代码中的操作流程是什么?C/C++.
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 此代码验证公式是什么意思?
- 这是什么代码?为什么它有效?C++
- 当您希望在Arduino Uno编程中同时执行不同函数时,使用什么代码/语句
- 这是什么代码?C或C
- 在 c++ 中应该使用什么代码而不是 getche
- 什么代码更适合用于运算符重载
- 什么代码可以使这个循环工作