C++指针光速复习(献给所有酷爱python但是要用C++却想不起来指针的人)
原理我有空会补充的,包括更详细的介绍。
本文档会有很多冗余,方便在整体上查阅顺畅(也可能没什么冗余)
文章目录
指针的原理介绍
呐呐呐呐呐呐呐呐呐有空我会补上的,默认这里只是需要快速回顾指针的人。
指针的声明
语法: Type_name * Variable_Name1,…
每个指针之前必须有*号
int *p1,*p2,v1,v2; //其中p1,p2为指针
小贴士
定义指针类型
int* p1,p2; //这里只有p1是指针,p2是int
int *p1,*p2; //这样才是两个都是指针
//可以这么写()
typedef int* IntPtr;
IntPtr p1,p2 //这样两个都是指针
//当然我自己更习惯在名称中说清楚,别啥都是叫p啥啥的
int *val1POINTER,*POINTER_val2 //虽然不符合编程规范,但是足够醒目
&操作符和*操作符
&用于获取一个变量的地址
具体采用*来访问指针的内容时:*称为提领操作符,指针变量通过该字符认为被提领了
提领操作符(dereference)*,就是 “取指针指向的值”或“把指正所指的值提领回来”
又称 解引用、 逆向引用、 用引 等
int *p1,v1;
p1 = &v1;
*p1 = 43; //*称为提领操作符
cout<<v1<*p1<<endl;
.操作符与->操作符
. 是非指针变量访问元素的方式
-> 是指针变量访问元素的方式!!
head.content;
headPOINTER->content;
(*headPOINTER).content;
一些需要注意的内容
请勿混淆如下表达式
int *p1,*p2;
p1 = p2; //指针p1也指向指针p2所指的内容(p2存储的地址给了p1) |指向变化
*p1 = *p2; //将p2指针指向的内容 赋值给 p1指针指向的内容 |存储内容变化
有关new操作符(动态变量)
new基础
操作符new创建指定类型的一个新动态变量,返回指向新变量的指针
新建Mytype类型动态变量:
Mytype *p;
p = new Mytype;
如果类型含有构造函数,就调用默认构造函数
int *n;
n = new int(17);
Mytype *p;
p = new Mytype(12,"test"); //调用Mytype(int,string)
new一个结构体参加下面的例子:基本上和new一个int差不多。
delete基础
删除一个new出来的变量
delete p;
删除一个动态数组
delete [] array_ptr
如何new一个结构体?(百练2775:文件结构“图”)
这个结构体涉及到了 递归定义 和 模板容器
FileDirType 类型的filedirtype变量是一个该类型的存储了
#include <vector>
#include <string>
typedef struct FileDirType{
string dirname;
vector<string> filelist;
int layer_level;
vector<struct FileDirType*> filedirtype;
}MyFileDirType;
//实际新建一个节点的内容
MyFileDirType* newone = new MyFileDirType;
newone->dirname = "NAME";
newone->layer_level = 1;
//遍历vector<string> filelist
MyFileDirType content;
for (
vector<struct FileDirType*>::iterator it = content.filedirtype.begin();
it != content.filedirtype.end();
it++) {
function(**it);
}
// *it表示迭代器指向的内容(这里面存了一个FileDirType*指针类型)
// *(*it)表示实际指向的FileDirType对象
// **it类型为 FileDirType
//如果是指针类型:
for (
vector<struct FileDirType*>::iterator it = newone->filedirtype.begin();
it != newone->filedirtype.end();
it++) {
function(**it);
}
自动变量、静态变量、普通变量、全局变量
挖坑施工中~
动态数组(我不会,vector它不香么)
指向数组的指针(静态和动态)
int a[10];
int *p1;
p1 = a;
int* p2;
p2 = new int[array_size];
销毁动态数组
delete [] arrat_ptr;
指针运算
指针运算是地址运算而非数字运算
double* dPOINTER;
int array_size = 10;
dPOINTER = new double[array_size];
//double占用8个字节,假设dPOINTER 地址为2020,那么dPOINTER+1地址为2009
//如下两种写法等价
for (int i = 0; i < array_size; i++){
cout<<*(dPOINTER+i)<<endl;
}
for (int i = 0; i < array_size; i++){
cout<<dPOINTER[i]<<endl;
}
多维动态数组
注意是指向指针的指针 **
int row = 10, column = 5;
int **p = new int* [row];
for (int i = 0; i < row; i++) {
p[i] = new int[column];
}
//blablabla
//blablabla
//blablabla
for (int i = 0; i < row; i++) {
delete[] p[i];
}
delete[] p;