指针数组和数组指针
421字约1分钟
2024-09-19
指针数组和数组指针
指针数组
#include <stdio.h>
int main()
{
int a = 10, b = 20, c = 30;
int* arr[3] = {&a, &b, &c};
// 根据前面学了下面这俩是相同的
int* a2 = arr[0];
int** a3 = arr;
}
数组指针
数组指针 指向了整个数组
#include <stdio.h>
int main()
{
int arr[3] = {10, 20, 30};
// 这里使用 &arr 的原因是:
// 直接使用 arr 隐式转换为 &arr[0]
// 表示指向 arr 中的第一个元素的地址
// 而使用 &arr 才能指向整个数组的内存地址
// 所以这里的输出是20
int (*p)[3] = &arr;
printf("%d",*(*p+1));
}
- p 代表整个数组
- *p 代表数组的首个元素
- *p+i 表示所指向的第 i 的元素
- *(*p+i) 表示取出第 i 位的元素
二维数组
#include <stdio.h>
int main()
{
int arr[][3] = {{10, 20, 30}, {1, 2, 3}};
// 这里使用 arr 的原因是:
// 直接使用 arr 隐式转换为 &arr[0]
// 表示指向 arr 中的第一个元素的地址
// 也就是数组中的第一个子数组
// 所以这里的输出是30
int (*p)[3] = arr;
printf("%d", *(*p + 2));
}
如果需要取出二维数组中整个数组
#include <stdio.h>
int main()
{
int arr[][3] = {{10, 20, 30}, {1, 2, 3}};
// 这里使用 arr 的原因是:
// 直接使用 arr 隐式转换为 &arr[0]
// 表示指向 arr 中的第一个元素的地址
// 而使用 &arr 才能指向整个数组的内存地址
// 所以这里的输出是 2
int (*p)[2][3] = &arr;
printf("%d", *(*(*p + 1) + 1));
}