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创建指定类型的一个新动态变量,返回指向新变量的指针 新建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差不多。
删除一个new出来的变量
delete p;删除一个动态数组
delete [] array_ptr这个结构体涉及到了 递归定义 和 模板容器 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); }挖坑施工中~
指针运算是地址运算而非数字运算
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;