多级指针
二级指针
c
#include <stdio.h>
int main()
{
int a[] = {1, 2, 3};
int b[] = {4, 5, 6};
// 定义指针数组
int *arr[] = {a, b};
printf("%d\n", *arr[0]); // 1
printf("%d\n", *arr[1]); // 4
printf("%d\n", arr[0][1]); // 4
printf("%p\n", arr); // 是 arr[0]的地址 0x00aa
printf("%p\n", &arr[0]); // 取arr[0]的地址的值,arr[0]本身的地址 0xaaff 存放的是指向 a 的地址 0x00aa
printf("%p\n", a); // a[0] 的地址
// arr + 0 本身的地址,*(arr + 0) 取地址上存的值,值是 a 的地址
printf("%d\n", *(*(arr + 0) + 0));
printf("%d\n", *(*(arr + 0) + 1));
printf("%d\n", *(*(arr + 1) + 0));
return 0;
}
多级指针
c
#include <stdio.h>
int main()
{
int a[] = {1, 6, 0};
int b[] = {4, 5, 6};
int c[] = {7, 8, 9};
// 指针数组对应二级指针
int *arr[] = {a, b, c};
// 指针数组和二级指针建立关系
int **p = arr;
// 相当于 arr[0][0]
printf("%d\n", **p);
// 相当于 arr[0][1]
printf("%d\n", *(*p + 1));
int a1 = 1;
int a2 = 2;
int *p1 = &a1; // 存的 a1 地址
int **p2 = &p1; // 存的 p1 的地址(不是值,值是 a1 的地址)
*p2 = &a2; // 等价于 p1 = &a2;
printf("%d\n", *p1);
**p2 = 100;
printf("%d\n", a2);
return 0;
}
地址传递
c
#include <stdio.h>
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a = 1;
int b = 2;
// 地址传递
swap(&a, &b);
printf("%d\n", a);
printf("%d\n", b);
return 0;
}