结论:
(1)一个指针型指针指向一个指针型地址 (int **pp)
(2)一个数组型指针指向一个数组型地址 (int (*ap)[5])
(3)指针型数组变量就是一个指针型地址 (int *pa [5])
(4)数组型数组变量就是一个数组型地址 (int aa[3][2])
因为我们知道XX型数组就是代表一个XX型的地址,而指针就是代表某种数据类型的地址,所以上面的四种形式其实有的是可以相互等同的。即,指针型指针 == 指针型数组;数组型指针 == 数组型数组(也就是二维数组)。
1、指针型指针和指针数组
char *a[] = {"i","am","a","boy", NULL};
char **p = NULL;
for(p = a; *p ! = NULL; P++) //p = a, 将a赋值给p。此时他们都指向同一个字符串常量位置。
{
printf("%s\n", *p);
}
用指针型数组对多个字符串进行排序的一个优点是,不需要进行字符串移动,只需要改变指针的指向。
对比如下:
/**********************字符串排序指针数组实现**********************/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *temp = NULL;
char *ptr[] = {"JAVA", "BASIC", "PASCAL", "FORTRAN", "VISUAL C"}; //定义指针数组
int i=0, j=0;
int n = sizeof(ptr)/sizeof(ptr[1]); //可以看出ptr符合数组的概念
for(i=0; i<n-1; i++)
{
for(j=i+1; j<n; j++)
{
if(strcmp(ptr[i], ptr[j]) < 0)
{
temp = ptr[i]; //直接排序指针,不移动字符串本身
ptr[i] = ptr[j];
ptr[j] = temp;
}
}
}
printf("%d\n", n);
for(i=0; i<n; i++)
printf("%s\n", ptr[i]);
system("pause");
return 0;
}
/**********************字符串排序二维数组实现**********************/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char temp[10] = {'\0'};
int i=0, j=0;
char ss[][10] = {"JAVA", "BASIC", "PASCAL", "FORTRAN", "VISUAL C"}; //用二维数组存储多个字符串
int n = sizeof(ss)/sizeof(ss[1]);
for(i=0; i<n-1; i++)
{
for(j=i; j<n; j++)
{
if(strcmp(ss[j], ss[i])<0) //直接移动字符串本身
{
strcpy( temp, ss[i]); //字符串赋值必须是使用strcpy函数
strcpy( ss[i], ss[j]);
strcpy( ss[j], temp);
}
}
}
printf("%d\n", n);
for(i=0; i<n; i++)
printf("%s\n", ss[i]);
system("pause");
return 0;
}
运行结果:
2、数组指针和二维数组
定义数组指针 int (*ap)[5] -这是一个指针,指针指向的类型为int[5],这是一个一维数组型变量。【注意:[]的优先级高于“*”,所以需要用()来改变一下优先级】
即有int (*P) [3] == int a[2][3]成立。
本文参考自人民邮电大学出版赵岩《C语音点滴》,第10章10.6的内容,内容进行过整理,代码也进行过完善。