欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

指针数组与数组指针、二级指针和二维数组(C语言)

程序员文章站 2022-07-07 11:52:00
...

1、指针数组与数组指针

详细:http://c.biancheng.net/view/335.html

1.1指针数组

int *p1[5]; 指针数组

首先,因为"[ ]" 的优先级要比" * "的优先级要高,所以所以p1[5]首先是一个数组,然后其元素类型为整型指针类型。我们可以称为指针类型的数组,简称指针数组。
指针数组与数组指针、二级指针和二维数组(C语言)
1.2数组指针

int (*p2)[5];数组指针

指针变量名为p2, 它指向一个包含5个int类型的数组的首地址。并且该数组没有名字,是一个匿名数组。
指针数组与数组指针、二级指针和二维数组(C语言)
1.3易混
由此可见,对指针数组来说,首先它是一个数组,数组的元素都是指针。而对数组指针来说,首先它是一个指针,它指向一个数组

int arr[5]={12345};
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;
}

输出是正确的。
指针数组与数组指针、二级指针和二维数组(C语言)
若按照这个逻辑,我们试一试可以用二级指针指向二维数组不?

int main(){
	int a[2][3]={1,2,3,4,5,6};
	int **p = a;
	printf("%d",**p);
	return 0;
}

出现了错误:
指针数组与数组指针、二级指针和二维数组(C语言)
二维数组,若要用指针来表示,就必须用数组指针类型
如:

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;
}

还有,我们访问二级指针指向的元素时可以用数组形式访问。
之后再补充。