指针数组与数组指针、二级指针和二维数组(C语言)
程序员文章站
2022-07-07 11:52:00
...
1、指针数组与数组指针
详细:http://c.biancheng.net/view/335.html
1.1指针数组
int *p1[5]; 指针数组
首先,因为"[ ]" 的优先级要比" * "的优先级要高,所以所以p1[5]首先是一个数组,然后其元素类型为整型指针类型。我们可以称为指针类型的数组,简称指针数组。
1.2数组指针
int (*p2)[5];数组指针
指针变量名为p2, 它指向一个包含5个int类型的数组的首地址。并且该数组没有名字,是一个匿名数组。
1.3易混
由此可见,对指针数组来说,首先它是一个数组,数组的元素都是指针。而对数组指针来说,首先它是一个指针,它指向一个数组
int arr[5]={1,2,3,4,5};
int (*p1)[5] = &arr;
/*下面是错误的*/
int (*p2)[5] = arr;
p1、p2 都是数组指针,p1 指向数组arr的地址,p2指向数组arr首元素的首地址。虽然两个值是相同的,但是因为类型不一样。可能有些编译器就不能通过。
2、二级指针和二维数组
我们经常会用一级指针来指向一维数组,如以下例子:
int main(){
int a[3]={1,2,3};
int *p = a; //一级指针指向一维数组
printf("%d",*p);
printf("%d",*(p+1));
printf("%d",*(p+2));
return 0;
}
输出是正确的。
若按照这个逻辑,我们试一试可以用二级指针指向二维数组不?
int main(){
int a[2][3]={1,2,3,4,5,6};
int **p = a;
printf("%d",**p);
return 0;
}
出现了错误:
二维数组,若要用指针来表示,就必须用数组指针类型
如:
int main(){
int a[2][3] = {1,2,3,4,5,6};
int (*p)[3] = &a[0];
printf("值为:%d\n",(*p)[0]);
printf("值为:%d\n",(*p)[1]);
printf("值为:%d\n",(*p)[2]);
p++;
printf("值为:%d\n",(*p)[0]);
printf("值为:%d\n",(*p)[1]);
printf("值为:%d\n",(*p)[2]);
getchar();
return 0;
}*/
我经常会犯一个错误,就是用二级指针作为形参想要传递一个二维数组。
如:
void demo(int **array){
return;
}
int main(){
int array[5][5];
demo(array);
return 0;
}
还有,我们访问二级指针指向的元素时可以用数组形式访问。
之后再补充。