定义形式:int *a[10];
说明
:[]
的优先级高于*
,该定义形式应该理解为:int * (a[10]);括号里面说明a是一个数组,包含了10
个元素,括号外面说明每个元素的类型为int *。
如图所示:
定义形式:int (*p)[10]; 其中,由于[]的优先级高于*,所以必须添加(*p).
在32位系统下任何类型的指针所占内存大小都为4个字节,至于它指向的数组占多少字节,具体要看数组的大小。总之,数组指针即为“指向数组的大小”
总结:主要看后面的两个字是什么(前面是修饰作用),因此指针数组是数组,而数组指针是指针。
(1)最简单的使用方式:
#include <stdio.h>
int main(){
int a = 16, b = 932, c = 100;
//定义一个指针数组
int *arr[3] = {&a, &b, &c};//也可以不指定长度,直接写作 int *arr[]
//parr 是指向数组 arr 的指针,确切地说是指向 arr 第 0 个元素的指针,
//它的定义形式应该理解为int *(*parr),括号中的*表示 parr 是一个指针,括号外面的int *表示 parr 指向的数据的类型。
//arr 第 0 个元素的类型为 int *,所以在定义 parr 时要加两个 *。
int **parr = arr;
printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);//16, 932, 100
printf("%d, %d, %d\n", **(parr+0), **(parr+1), **(parr+2));//16, 932, 100
return 0;
}
(2)对多个字符串进行处理:
#include <stdio.h>
int main(){
char *str[3] = {
"c.biancheng.net",
"C语言中文网",
"C Language"
};
printf("%s\n%s\n%s\n", str[0], str[1], str[2]);
/*
运行结果:
c.biancheng.net
C语言中文网
C Language
*/
return 0;
}
.
(1)对于一维数组:
int main(void)
{
char a[5]={'A','K','C','G','L'};
char (*p)[5]=&a;//&a代表的是整个数组的首地址
//char (*p)[5]=a;这样是错误的,因为a代表第一个元素的首地址
printf("%c %c %c",**p,*(*p+1),*(*p+3));//输出:A K G
return 0;
}
(2)对于二维数组:
二维数组用行指针定义
#include <stdio.h>
int main()
{
int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
int(*p)[4];//p指向数组 a 的开头,也即第 0 行;p+1前进一行,指向第 1 行。
int i,j;
p=a;
for(i=0; i<3; i++)
{
for(j=0; j<4; j++)
printf("%2d ",*(*(p+i)+j));//*(*(p+i)+j)表示第 i 行第 j 个元素的值。
printf("\n");
}
/*
0 1 2 3
4 5 6 7
8 9 10 11
*/
return 0;
}
ref: