注意"int *pa[5]"與"int (*pb)[5]"的區(qū)別。
int (* pb)[5];
表示定義了一個(gè)指向數(shù)組的指針pb,pb指向的數(shù)組是一維的體積為5的整型數(shù)組,其結(jié)構(gòu)如圖10-10所示。
char * line[5];
表示line是一個(gè)5個(gè)元素的數(shù)組,每個(gè)元素是一個(gè)指向字符型數(shù)據(jù)的一個(gè)指針。若設(shè)指向的字符型數(shù)據(jù)(字符串)分別是"ONE"、"TWO"、…、"FIVE",則數(shù)組line的結(jié)構(gòu)如圖10-11所示。
而:char (*line)[5];
表示line是指向一個(gè)長(zhǎng)度為5的字符數(shù)組的指針。
指針數(shù)組常適用于指向若干字符串,這樣使字符串處理更加靈活方便。
例10-16:輸入字符串,判斷該字符串是否是英文的星期幾。使用指針數(shù)組實(shí)現(xiàn)。
#include <stdio.h>
char *week_day[8]= {"sunday", "monday", "tuesday", "wednesday",
"thursday", "friday", "saturday", NULL
}; /* 說(shuō)明指針數(shù)組。數(shù)組中的每個(gè)元素指向一個(gè)字符串 */
main( )
{ int m;
char string[20];
printf("Enter a string: ");
scanf("%s", string);
m=lookup(string);
printf("l=%d\n", m);
}
lookup (ch)
char ch[ ]; /* 傳遞字符串(字符數(shù)組) */
{ int i, j;
char *pc;
for (i=0; week_day[i]!=NULL; i++) /* 完成查找工作 */
{ for( pc=week_day[i],j=0; *pc==ch[j] && *pc!= ‘\0‘; j++,pc++ );
if ( *pc==‘\0‘ )
return(i); /* 若找到則返回對(duì)應(yīng)的序號(hào) */
}
return(-1); /* 若沒(méi)有找到,則返回-1 */
}
程序中沒(méi)有使用二維的字符數(shù)組,而是采用指針數(shù)組week_day??梢钥吹街羔様?shù)組比二維字符數(shù)組有明顯的優(yōu)點(diǎn),一是指針數(shù)組中每個(gè)元素所指的字符串不必限制在相同的字符長(zhǎng)度,二是訪問(wèn)指針數(shù)組中的一個(gè)元素是用指針間接進(jìn)行的,效率比下標(biāo)方式要高。
例10-17:輸入星期幾,輸出對(duì)應(yīng)星期的英文名稱。用指針數(shù)組實(shí)現(xiàn)。
#include <stdio.h>
char * week_day[8]= {"sunday", "monday", "tuesday", "wednesday",
"thursday", "friday", "saturday", NULL };
/* 說(shuō)明指針數(shù)組。數(shù)組中的每個(gè)元素指向一個(gè)字符串 */
main( )
{ int day;
char *p, *lookstr( );
printf("Enter day: ");
scanf("%d", &day);
p = lookstr (week_day, day);
printf("%s\n", p);
}
char * lookstr ( table, day ) /* 函數(shù)的返回值為指向字符的指針 */
char *table[ ]; /* 傳遞指向字符串的指針數(shù)組 */
int day;
{ int i;
for (i=0; i<day && table[i]!=NULL; i++) ;
if (i==day && table[i]!=NULL)
return ( table[day] );
else return(NULL);
}
例10-18:修改程序10-11,用數(shù)組指針作為形參實(shí)現(xiàn)函數(shù)day_of_year。
#include <stdio.h>
main( )
{ static int day_tab[2][13]={ 0,31,28,31,30,31,30,31,31,30,31,30,31,
0,31,29,31,30,31,30,31,31,30,31,30,31 };
int y, m, d;
scanf ("%d%d%d", &y, &m, &d);
printf("days=%d\n", day_of_year( day_tab, y, m, d ) );
}
day_of_year (day_tab, year, month, day)
int (*day_tab)[13], year, month, day; /* day_tab為數(shù)組指針 */
{ int i, j;
i = year%4==0 && year%100!=0 || year%400==0;
for (j=1; j<month; j++)
day += (*(day_tab+i))[j]; /* 引用數(shù)組指針指向的數(shù)組中的元素 */
return (day);
}
請(qǐng)將例C10-11.C和例C10-18.C函數(shù)day_of_year進(jìn)行比較,體會(huì)不同類型的形式參數(shù)在函數(shù)中的使用方法。
事實(shí)上,在程序中可以用指針靈活地處理多維數(shù)組,使程序優(yōu)化,并可提高程序的技巧。例如:對(duì)于一個(gè)三維數(shù)組
long a[100][100][100];
要將所有的元素都清0,可采用下面兩種方法:
方法一:采用常規(guī)的多維數(shù)組處理方式 方法二:采用指針處理方式
long a[100][100][100], i , j, k; long a[100][100][100], i, *pa;
for (i=0; i<100; i++) pa = a;
for (j=0; j<100; j++) for (i=0; i<100*100*100; i++)
for (k=0; k<100; k++) *pa++ = 0;
a[i][j][k]=0;
方法一直接使用三維數(shù)組中的數(shù)組元素,訪問(wèn)其中的任一數(shù)組元素a[i][j][k]時(shí),每次都要調(diào)用數(shù)組元素地址的計(jì)算公式。而方法二則利用三維數(shù)組在內(nèi)存中是按行線性順序存放的這一特性,通過(guò)一個(gè)指針順序加1的方法實(shí)現(xiàn)對(duì)數(shù)組a中所有元素的賦0操作。兩種處理方法相比較,方法二處理速度比方法一快得多。
聯(lián)系客服