浅入理解c++中的指针哈

发布于:2022-11-28 ⋅ 阅读:(692) ⋅ 点赞:(0)

目录

一)*与&的区别:

二)*  · ** · 数组 之间的关系:

三)我曾经的疑问:

1.为什么对char*a直接赋值char *a=“abcd”为错?

2.int *p[3]与int (*p)[3]的区别?


一)*与&的区别

1.&表示取址;

2.*一般被称作指针运算符,又叫反向取址运算符,与&作用相反

二)*  · ** · 数组 之间的关系:

1.可以这样理解 :数组就是指针

        没有方括号和下标的数组名称实际上代表数组的起始地址,此时数组名称实际上就是一个指针。array[index] 相当于 *(array + index)。这也就是为什么int *a可以直接指向int[]数组;也解释了形参为int *a,实参可以传递a[];

指针的作用:动态申请数组

	int d = 10;
	int *next = new int[d];   

2.*类型的变量存储的值是内存地址;**就是存储指针地址,是指针的指针。

int *ptr;可以动态申请一维数组——>那int**ptr,就可以动态申请二维数组;

	int** A;	
	A = new int* [5]; 	
	for (int i = 0; i < 5; i++)
		A[i] = new int[3];
	A[0][2] = 1;
	A[4][1] = 3;;

【解释一下,int **A,它是指向一个指针,而我们前面所说,数组就是指针,那么就有*A是一维数组,那**A就是一维数组的一维数组,也就是二维数组。】

再来个例子,下面是我写图的时的代码:

template<class T>
class Edge {
public:
	T data;
	Edge<T>* next;
	Edge(){}
	Edge(T data) {
		this->data = data;
		this->next = null;
	}
};
template<class T>
class Vertex {
public:
	T data;
	Edge<T>* first;
	Vertex(){}
	Vertex(T data) {
		this->data = data;
		this->first = null;
	}
};
template<class T>
class Graph {
	Edge<T>** edges;//*edges表示指向Edge的指针,那**edges就是指向 指向Edge指针的指针,而指针又可以
					//动态申请数组(譬如:int *a=new int[10]),所以**edges可以动态申请自定义对象数组
	Edge<T>* edges_two[10];//这就属于“静态”申请
public:
	Graph() {}
	Graph(int num) {
		edges = new Edge<T>*[num] {};
		for (int i = 0; i < num; i++) {
			edges[i] = new Edge<T>(i + 1);
		}
	}
	void add_edge(T data, Vertex<T>*& vertex) {

	}
};

三)我曾经的疑问:

1.为什么对char*a直接赋值char *a=“abcd”为错?

答:正如上文所言,指针指向的是一个地址;

你如果直接赋值,相当于把一个常量给了指针,肯定错啊。

2.int *p[3]与int (*p)[3]的区别?

答:再次强调一下:指针就是数组,那么如果我想让一个指针指向一个数组怎么办?就得这样声明:int (*p)[3]; 而int *p[3],它是一个指针数组,即数组中每一个元素是一个指针,而我们指针可以直接指向一个数组,所以int *p[3]可以当做一个二维数组。

见代码:

	int* pp[3]{};
	pp[0] = new int[10];
	pp[1] = new int[10];
	pp[2] = new int[10];
	pp[0][5] = 3;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 10; j++) {
			cout << pp[i][j] << endl;
		}
	}
	int aa[3][3] = { {1,3,2},{1,2,3},{3,2,1} };
	int bb[3] = { 1,2,3 };
	int(*w)[3];
	w = aa;

【未完待续···(To be continued···)】

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到