指针

指针

指针,存放的是地址,指向地址上的值
一般的,指针的用处是 1、实现动态数组 2、实现链表等数据结构




指针定义


指针类型 * 指针变量
如:

int a;
int *p; //注意:定义指针时的*属于声明,并不是取值符
p = &a; //&为取地址符,p存放a的地址
所以 *p 等价于 a; //*为取值符



指针类型


数组指针

指向数组的指针,存放数组的地址

注意:数组名是首地址,&数组名才是数组地址


指向数组的类型 (*指针变量)[数组中元素个数]

如:

int a[5] = { 1, 2, 3, 4, 5 };
int (*p)[5] = &a;
for (int i = 0; i < 5; i++) {
	cout << (*p)[i] << " ";
}
输出结果:1 2 3 4 5

函数指针

指向函数的指针,存放函数的地址

注意:函数名就是函数地址


指向函数的类型 (*指针变量)(函数的参数列表

如:

int max(int x, int y) {
	return x > y ? x : y;
}
int main() {
	int (*p)(int, int) = max;
	cout << (*p)(3, 5);    //函数指针的调用,*p即运用取值找到该函数
	return 0;
}	
输出结果:5



指针操作


int *p;
p++;   //指针p指向下一个
p--;     //指针p指向上一个
	
int (*p)[5]= &arr;
cout << *(p+1);  //指向地址(下标)为1的元素,即arr[1]



动态数组

极其节省空间,动态分配数组空间


动态数组的使用有两种方式:1、指针(如*(p+1)) 2、数组下标(如a[1])

指针可以当作数组名,如一级指针p可以当一维数组名,二级指针pp可以当二维数组名


动态一维数组

int main() {
	int n;
	cin >> n;
	int *p = new int[n];     //此处是将p当作数组名看待,申请一个int型大小为n的空间存放int型的指针p
	for (int i = 1; i <= n; i++) {
		cin >> *(p+i);
    }
	for (int i = 1; i <= n; i++) {
		cout << *(p+i) << " ";
    }
	delete[] p;
	return 0; 
}

输入:5
1 2 3 4 5

输出:1 2 3 4 5


动态二维数组

运用多级指针实现,主要思路就是把二维数组当作多个一维数组来看待。

int r = 5;	//用于表示行数
int c = 5;	//用于表示列数
int **arr = new int*[r];	//开辟一块内存来存放每一行的地址
for (int i = 0; i < row; i++)	//分别为每一行开辟内存
    arr[i] = new int[c];
//这是一个r行c列的动态二维数组。



链表


链表


posted @ 2023-09-17 16:07  Codaaaa  阅读(19)  评论(0)    收藏  举报