指针进阶--数组指针
数组指针
是一种指向数组的指针。
int main()
{
int arr[5]={1,2,3,4,5};
int (*parr)[10]=&arr;//数组指针。parr中存放的是数组的地址。
return 0;
}
照猫画虎:
int main()
{
double* d[5];
double* (*pd)[5];
return 0;
}
数组名
数组名是首元素的地址,但是有两个例外。
1、sizeof(数组名)--数组名代表的是整个数组,计算的是数组大小,单位是字节。
2、&数组名--数组名表示整个数组,取出的是整个数组的地址。
int main()
{
int arr[10]={0};
printf("%p\n", arr);
printf("%p\n", &arr);
return 0;
}
上面代码,两个打印函数的结果是一样的,说明它们指向的位置是相同的,但是它们的意义却不同。 数组名arr指向的是首元素的地址,&arr指向的是数组的首地址,它们的值相同,但是类型不同。
int main()
{
int arr[10];
int *p1 = arr;
int (*p2)[10] = &arr;
printf("%p\n", p1);
printf("%p\n", p1+1);
printf("%p\n", p2);
printf("%p\n", p2+1);
return 0;
}
p1+1,增加一个整型(4个字节),但是p2+1增加的是一个数组(4*10个字节)。 所以在使用数组的地址是,我们要取出数组的首地址(&arr),而不是使用首元素地址(arr)。
数组指针的使用
在一维数组中使用
一般不在一维数组中使用。
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
//int *p=arr;
int (*pa)[10]=&arr;//数组指针
for(int i=0; i<10; i++)
{
printf("%d" *((*pa)+i)));
}
return 0;
}
可以用&数组名打印数组,但是与使用数组名的方法比较很别扭。
在二维数组中使用。
不用数组指针,使用行列打印。
void print(int arr[3][5], int r, int c)
{
for(int i=0; i<r; i++)
{
for(int j=0; i<c; j++)
{
printf("%d ", arr[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(arr, 3, 5);
return 0;
}
使用数组指针:
void print(int (*p)[5], int r, int c)
{
for(int i=0; i<r; i++)
{
for(int j=0; i<c; j++)
{
printf("%d ", *(*(p+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(arr, 3, 5);//arr代表首元素(第一行)的地址。
return 0;
}
int arr[5]; 整型数组。
int *parr[10];--整型指针的数组。
int (*parr2)[10];--数组指针,指向一个存放10个元素,类型为int的数组。
int (*parr3[10])[5];-- parr3是一个存放数组指针的数组,该数组能够存放十个数组指针,每个数组指针指向一个数组,数组有五个元素,类型是int。