这个带有向量的简单代码有什么问题?

What is wrong with this simple code with vectors?

本文关键字:什么 代码 问题 简单 向量      更新时间:2023-10-16

下面的代码是我为自己编写的代码,用于测试指针和向量的工作原理。

我对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;

aint*,但bc只是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;

基本上,只有aint *;bc只是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;