本文为原创,转载请注明出处。如有不对,请与我联系,我会在第一时间进行改正。

include<iostream>

using namespace std;

int main() {

指针声明与使用

cout << "指针声明与使用" << endl;
int a = 5;
int* p = &a;//&(取地址符,拿到目标的地址)
cout << p << endl;//输出结果为值的地址
cout << *p << endl;//输出结果为值本身

使用*创建指针,指针不能直接指向变量名。指针内存储的是值的地址,所以要使用取址符&把变量的地址拿过来存储到指针中。
在第七行中直接输出指针p,得到的结果是值得地址,但是进行解引用后(第八行进行了解引用)得到的就是值本身。(在指针不是空指针时在指针前加上*则是解引用,意思是取指针里面的值本身)

使用new来分配内存

cout << "使用new来分配内存" << endl;
int* d = new int;
*d = 100;
cout << d << endl;//输出结果为值地址
cout << *d << endl;//输出结果为值本身

使用new来分配内存,new分配的是一个无名的内存,这也就意味着无法直接使用变量名来操作这块内存,
但是可以使用指针来操作,而且操作类似直接使用变量名。比如在第十九行时给这块内存里放入了一个数字100,
就像是直接使用内存一样直接复制即可。但是在进行输出时要对指针进行解引用才能拿到里面的值,不然直接输出
得到的是值的地址。

使用delete来释放内存

cout << "使用delete释放内存" << endl;
int* b = new int;
*b = 1000;
cout << *b << endl;
delete b;

有些时候分配的内存需要自己手动释放,比如使用new分配的内存就需要自己的手动释放。
使用delete可以释放已分配的内存,注意delete释放的是内存块但是指向内存块的指针依旧可以使用。
在第三十四行使用new分配了一个存储int的内存块,在第三十七行,使用delete释放了这块内存,但是指向内存
的指针可以使用,指向新的内存。delete只能用于new分配的内存,不能用delete释放声明变量所获得的内存。

使用new来创建动态数组

cout << "使用new来创建动态数组" << endl;
int* f = new int[10];
f[0] = 1;
f[1] = 2;
f[3] = 3;
//f = f + 1;
cout << f << endl;

cout << f[0] << endl;
cout << sizeof(f) << endl;
for (int i = 0; i < 10; i++) {
    f[i] = i;
    cout << f[i] << " ";
}
delete[] f;

使用new来创建动态数组,格式如第47行,使用完数组后也需要释放,释放格式如第54行。
使用new创建动态数组时,直接使用指针操作即可,类似于数组名操作数组。
注意这里指针默认指的是数组的首地址。
在输出事使用指针名加下标即可输出数组内的元素。注意在对数组进行赋值时不能f = {1,2,3,4}这样一次性多个复制
需要一个一个的进行,如48到51行。
注意在对指针名进行加减时,数组内的值不会改变,改变的是指针所指的位置,但是这样在进行释放时会报错.
(原因是new的时候指针是指向第一个首地址,所以在释放时也应该释放的同样的地址,但是在进行+1时,地址向后偏移了,所以释放时就不再是原地址,会报错。)
使用sizeof来检查大小时返回的是第一个元素的大小。
在第56行到59行使用for循环来为每一个元素赋值。

使用delete注意点

一.不能使用delete释放不是new创建的内存。
二.不能使用delete释放一个内存两次。
三.如果使用new[]为数组分配内存,则应使用delete[]来释放。
四.如果使用new为一个实体分配内存,则使用delete(不带方括号)来释放。
五.对空指针使用delete是安全的。

指针,数组和指针算术

cout << "指针,数组和指针算数" << endl;
int h[5] = { 1,6,3,4,5 };
int* h1 = new int[5];
for (int i = 0; i < 5; i++) {
    h1[i] = i;
}
h[0] = h[0] + 1;
cout << h[0] << endl;
h1 = h1 + 1;
cout << *h1 << endl;
h1 = h1 - 1;
delete[] h1;

将指针变量+1,改变的是指针的位置,而不是指针所指向的值进行加减。
在多数情况下,c++将数组名解释为数组第一个元素的地址。
在多数情况下,可以以相同的方式使用数组名和指针名。可以相同的使用数组方括号表示法,也可以使用*(解引用运算符),
但是区别有两个:
一是可以修改指针的值,而数组名是常量(当修改指针的值时改变的时指针的地址,修改数组名时改变的是数组内的值)
二是对数组应用sizeof得到的是数组的长度,但是对指针应用sizeof得到的是指针的长度(指针长度指的是指针的类型长度,比如如果是int型就是四个字节)。

什么是堆栈
堆:这块区域由程序员自己分配与释放,其余数据结构中的堆是两码事,分配方式类似于链表。
栈:这块区域由编译器分配与释放内存空间,一般存储函数的参数值与局部变量值。类似于数据结构中的栈。

源文件下载地址:https://onlymitu.lanzous.com/inl7le3w0uj

文章目录