指针数组: 存放变量的地址,数组里的每个元素都是指针。
形式:int* arr3[5] = {&a,&b,&c,&d,&e}
[]优先级高,先与arr结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素
1.用指针将十个元素存入数组中
int arr[10] = {0};
int* p = arr; //指向数组第一个元素的地址
int i = 0;
for(i = 0;i < 10;i++)
{
*(p + i) = i; //解引用操作
}
for(i = 0;i < 10;i++)
{
printf("%d ",arr[i]);
}
3.指针数组的遍历
//指针数组
int arr1[] = {1,2,3,4,5};
int arr2[] = {2,3,4,5,6};
int arr3[] = {3,4,5,6,7};
int* arrp[] = {arr1,arr2,arr3};//存放每一个数组的首元素地址
int i ,j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 5;j++)
{
printf("%d ",*(arrp[i] + j));//解引用操作 输出每一行+偏移量
}
printf("\n");
}
2.用指针数组完成 三个字符串由大到小输出
int main()
{
char buf[3][100];
char *p[3] = {buf[0],buf[1], buf[2]};//存放每一行数组的首元素地址
int i,j;
for(i = 0; i < 3; i ++)
scanf("%s", p[i]);//输入三个字符串。
for(i = 0; i < 2; i ++)//排序。
for(j = i+1; j < 3; j ++)
{
if(strcmp(p[i], p[j]) > 0)
{
char * t = p[i];
p[i] = p[j];
p[j] = t;
}
}
for(i = 0; i < 3; i ++)
printf("%s\n", p[i]);//输出排序后的三个字符串。
}
数组指针:int (*p)[10];
首先和*结合,他一定是个指针,指针指向数组,数组是十个元素,每个元素的类型是int
一个字符型指针数组的数组指针形式:
char* p[10];
char* (*p)[10]=&arr;
数组指针的遍历 两种形式:
第一种:后跟元素下标使用
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
int (*p)[10] = &arr;
int i = 0;
for(i = 0;i < 10;i++){
printf("%d ",(*p)[i]); //p拿到的是数组的地址,*p == arr
}
第二种:*p == arr 数组名等于首元素地址 + i (向后跳i个元素),之后在解引用获得元素。
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
int (*p)[10] = &arr;
int i = 0;
for(i = 0;i < 10;i++){
printf("%d ",*(*p + i)); //*p+i == &arr[i]
}