【指针数组】和【数组指针】的简单理解
下面给出指针数组和数组指针的简单的定义,并同时给出其他类型的定义,方便对比理解。
- 指针数组:是一个数组,数组里面存的元素类型是指针:
#整型数组
int arr[10] = {0};
#字符数组
char arr[10] = {0};
#指针数组
int* arr[10] = {0}; #整型指针数组:存整型类型定义的指针的数组
char* arr[10] = {0}; #字符指针数组:存字符类型定义的指针的数组
- 数组指针:是一个指针,存的是数组的地址:
#整型指针
int a = 10;
int* Pa = &a;
#字符指针
char a = "abcd";
char* Pa = &a;
##数组指针中:首个元素是指向的数组的类型,第二元素是指针名称,第三个元素是指向的数组的大小。比如:
int* (*Parr) [10]
指向的数组类型---指针名称---指向的数组大小
## int* (*Parr) [10]:为什么要在(*Parr)外面写括号,是因为不写括号(int**Parr[10])就变成了数组,不再是指针。
数组指针
int arr[10] = {0};
int (*Parr) [10] = &arr; #整型数组指针:指向整型类型定义的数组的指针
char arr[10] = {0};
char (*Parr) [10] = &arr; #字符数组指针:指向字符类型定义的数组的指针
int* arr[10] = {0};
int* (*Parr) [10] = &arr; #整型指针数组指针:指向数组的指针,这个数组类型是存储整型指针
char* arr[10] = {0};
char* (*Parr) [10] = &arr; #字符指针数组指针:指向数组的指针,这个数组类型是存储字符指针
下面给个使用数组指针的实例:
//取数组名代表首元素地址,但在二维数组里面是首行的地址,也就是{1, 2, 3, 4, 5}的地址。
//所以变量可以定义为数组指针,定义指向这个数组地址的指针
void print_two(int (*Parr) [5], int x, int y)
{
int i = 0;
for(i = 0; i < x; i++)
{
int j = 0;
for(j = 0; j < y; j++)
{
//第一次解引用是将地址转换成数组;
//第二次解引用是因为数组名本身是首元素地址,取元素需要进行解引用。
printf("%d ", *(*(Parr + i) + j));
//也可以按下面这行来写
//printf("%d ", (*(Parr + i))[j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = {{1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {3, 4, 5, 6, 7}};
print_two(arr, 3, 5);
return 0;
}