我现在是高中三年级,而且我正在学习C++.由于我们已经完成了我们需要了解的一般编程(循环,if语句,函数,结构,数组和二维数组),我们启动了二进制/文本文件,我想我们学习文件学习内存管理.首先,我现在正在努力学习指针,因为如果我理解正确的话,在OOP中它们是必须的.其次,我想知道计算机是如何工作的,背后发生了什么.现在,我制作了这段小代码
int main()
{
char y;
char *x;
x = &y;
cout << "Write a word: ";
cin >> x;
cout << x << endl;
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并且它可以工作,但是当程序关闭时,我得到一个错误,表示变量'y'周围的堆栈已损坏.如果我没有混淆,堆栈是动态内存,堆是静态内存,考虑到我收到此错误,因为当程序关闭时变量y不在内存中.我在正确的道路上吗?
还有一个问题.我无法理解何时以及为什么我应该使用指针,例如:
int main()
{
int number = 10;
int* pointer;
pointer = &number;
*pointer = 15;
cout << *pointer << endl;
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么我不能简单地这样做:
int main()
{
int number = 10;
number = 15;
cout << number << endl;
}
Run Code Online (Sandbox Code Playgroud)
我为什么要使用指针?另外,我不明白为什么如果我创建一个char*并分配它,例如"hello"它写的是hello而不是h.基本上,通过声明一个char*我声明一个大小未知的数组,对吧?请告诉我它究竟是做什么的.
当程序关闭时,我得到一个错误,表示变量'y'周围的堆栈已损坏
因为通过接受整个字符串>>
来响应a char*
.指针必须指向足够大的缓冲区来保存该字符串,但它只指向堆栈变量x
.>>
不知道这一点,所以它只是提前收费并写入x
堆栈旁边的任何内容.
实际上,std::string
在这种情况下你最好使用:
std::string s;
std::cin >> s;
Run Code Online (Sandbox Code Playgroud)
从中读取一个单词cin
.
为什么我不能简单地这样做
您可以.在这个简单的程序中你不需要指针,但是你需要它们才能获得更高级的东西.即使你不经常使用它们(现代C++有很多设施可以通过更安全和更容易的构造来替换字符串),但仍然有助于知道std::string
,例如,使用指针实现:它实际上是一个char*
包含在类中的关心>>
你的事情.char*
如果需要更多空间来存储额外的字符,该类知道点的位置并进行调整.