C++指针光速复习(献给所有酷爱python但是要用C++却想不起来指针的人)

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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值