目录
1.为什么对char*a直接赋值char *a=“abcd”为错?
一)*与&的区别:
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 后查看