一个一维指针数组的定义:int *ptr_arry[10]
指针数组中的每一个元素均为指针,即有诸形如 “ *ptr_arry[i] ” 的指针。
由于数组名本身也是一个指针,因此指针数组中的元素亦可以表示为 “ *( *(ptr_arry+ i) ) ” 。又因为 “ () ” 的优先级较 “ * ” 高,且 “ * ” 是右结合的,因此可以写作 **(ptr_arry+ i)。
由于数组元素均为指针,因此ptr_arry[i] 是指第 i 个元素的指针。
指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便
#include<stdio.h>
#include<string.h>
int main()
{
char *str[] = {"welcome", "to", "techshine", "beijing"};
// 定义四个字符串指针,分别如上 str[0] str[1] str[2] str[3]
printf("str[0] = %s\n", str[0]); //welcome
printf("str[1] = %s\n", str[1]); //to
printf("str[2] = %s\n", str[2]); //techshine
printf("str[3] = %s\n", str[3]); //beijing
printf("str+1 = %s\n", *(str+1)); //to
printf("str+2 = %s\n", *(str+2)+6); //ine
char **p = str+1; // 指针的指针,指向 &str[1] 等价 str+1
str[0] = (*p++); // str[0] 指向了原来 str[1] 的地址 to
str[1] = *(p+1); // p指向了&str[2],str[1] 指向了原来 str[3] 的地址 beijing
str[2] = p[1]+3; // 因为现在p指向&str[2], 所以p[1],实际指向str[3],再偏移3个字符,所以指向 "jing"
str[3] = p[1]+(str[2]-str[1]); // 如上str[2]-str[1]相差三个偏移,所以str[3]=p[1]+3,所以同上一句
printf("str[0] = %s\n", str[0]); // to
printf("str[1] = %s\n", str[1]); // beijing
printf("str[2] = %s\n", str[2]); // jing
printf("str[3] = %s\n", str[3]); // jing
return 0;
}