数组指针和指针数组:
表达的优先级问题:
(*p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”,即数组指针;
*p[n]:根据优先级,先看[ ],则p是一个数组,再结合*,这个数组的元素是指针类型,共n个元素,这是“指针的数组”,即指针数组。
来看一个关于指针数组的代码:
const定义的变量在程序里禁止被改变。
#include "stdio.h"
int main (void )
{
int i,flag;
char ch;
const char *p[5]={"red","blue","yellow","green","black"};
printf("input a letter:");
ch=getchar();
printf("%c\n",*p[0]);
for(i=0;i<5;i++)
{
if(*p[i]==ch)
{
puts(p[i]);
flag = 1;
}
}
if(flag==0)
{
printf("Not Fount");
}
return 0;
}
其中p为指针数组,其中每个元素为数组,分别指向每个字符串的首字母。
printf("%c",*p[0]);
会输出r,也就是第一个字符串的首字母。
关于&p与p
&p指的是整个数组的地址,p指的是数组首元素的地址;两者虽然数值一样,但其的类型的是不同的,&p为数组指针,而p为指向单个字符的指针。
指针的指针:
定义:
类型名 **变量名;
也被称为二级指针,为指向指针的指针;
int a =10;
int *p=&a;
int **p=&p;
二维数组的指针形式:
对于a[3][5];
可以把二维数组a看成是由a[0],a[1],a[2];组成的一维数组;而a[0],a[1],a[2];各自又是一个一维数组。也就是说二维数组是数组元素为一维数组的一维数组。
即a[3][5]={a[0],a[1],a[2]};
所以a为a[0]整个数组的地址,所以a为一个二级指针。则,a+i为第i行的地址,*(a+i)为第i行首元素是地址,(即a[i]),又**a则为第i行首元素的值
在要处理多个字符串的情况下,我们通常用二维数组和指针数组:
#include "stdio.h"
#include "string.h"
int main(void )
{
int i;
char *p[5]={"red","blue","yellow","green","black"};
void fsort(char *p[],int n);
fsort(p,5);
for(i=0;i<5;i++)
{
printf("%7s",p[i]);
}
return 0;
}
void fsort(char *p[],int n)
{
char *temp;
int j,k;
for(j=0;j<n;j++)
{
for(k=j+1;k<n;k++)
{
if(strcmp(p[j],p[k])>0)
{
temp=p[j];
p[j]=p[k];
p[k]=temp;
}
}
}
}