该程序是学生数据库。这部分代码存储了学生专业(计算机科学与信息技术)。我无法弄清楚代码的作用。我从未在动态内存分配中遇到过这种格式。好的,第一行是指向数组的指针吗?那么第二行的指针呢?
string ** major;
major = new string*[3];
for(int i = 0; i < 3; i++)
major[i] = new string[2];
major[0][0] = "IT";
major[0][1] = "Information Technology";
major[1][0] = "CS";
major[1][1] = "Computer Science";
答案 0 :(得分:15)
此代码段的作用是什么?
它精心强奸了常见的C ++编程习语,并系统地破坏了代码的安全性。它是通过不必要地使用原始指针而不是使用标准容器对象(例如std::vector
)来实现的。
好的,第一行是指向数组的指针吗?
不,指向数组的指针如下所示:
int (*ptrToArr)[128];
你所拥有的是一个指向指针的指针。
那么第二行的指针呢?
没什么特别的。它只是new
将分配的对象类型。
答案 1 :(得分:4)
这是
string ** major; // Create a variable that *could* be used like a 2 dimensions array
major = new string*[3]; // Allocate the first dimension
for(int i = 0; i < 3; i++)
major[i] = new string[2]; // Allocate the second dimension
// Add some values
major[0][0] = "IT";
major[0][1] = "Information Technology";
major[1][0] = "CS";
major[1][1] = "Computer Science";
希望能帮助你理解。
答案 2 :(得分:2)
那段代码太可怕了。
首先它隐藏了一些魔术索引号背后的语义 - &gt;使用结构/类来组织数据
struct CourseDetails{
std::string name;
std::string abbrev;
// default constructor
CourseDetails(){}
// constructor that inits variables
CourseDetails(const std::string& i_name, const std::string& i_abbrev)
: name(i_name)
, abbrev(i_abbrev)
{}
};
第二,它使用容易出错的手动内存管理 - &gt;使用c ++容器。
std::vector<CourseDetails> major;
major.push_back(CourseDetails("Information Technology", "IT"));
major.push_back(CourseDetails("Computer Science", "CS"));
std::cout<< major[0].name << "/" << major[0].abbrev<< std::endl
如果您不想定义类型,可以使用std :: pair;
typedef std::pair<std::string, std::string> CourseDetails; // first = name, second = abbreiation
std::vector<CourseDetails> major;
major.push_back(CourseDetails("Information Technology", "IT"));
major.push_back(CourseDetails("Computer Science", "CS"));
std::cout<< major[0].first<< "/" << major[0].second<< std::endl
答案 3 :(得分:-5)
第一行是指向字符串指针的指针。在第二行中,此代码将内存(字符串指针类型)分配给“major”。在循环中,这段代码将memeory(字符串类型)分配给“major”数组中的每个成员(指针)。