二級C語言考試輔導(dǎo)教程第六章:指針[4]

字號:

二、多維數(shù)組的指針變量
     把二維數(shù)組a 分解為一維數(shù)組a[0],a[1],a[2]之后,設(shè)p為指向二維數(shù)組的指針變量??啥x為: int (*p)[4] 它表示p是一個(gè)指針變量,它指向二維數(shù)組a 或指向第一個(gè)一維數(shù)組a[0],其值等于a,a[0],或&a[0][0]等。而p+i則指向一維數(shù)組a[i]。從前面的分析可得出*(p+i)+j是二維數(shù)組i行j 列的元素的地址,而*(*(p+i)+j)則是i行j列元素的值。
     二維數(shù)組指針變量說明的一般形式為: 類型說明符 (*指針變量名)[長度] 其中“類型說明符”為所指數(shù)組的數(shù)據(jù)類型?!?”表示其后的變量是指針類型。 “長度”表示二維數(shù)組分解為多個(gè)一維數(shù)組時(shí), 一維數(shù)組的長度,也就是二維數(shù)組的列數(shù)。應(yīng)注意“(*指針變量名)”兩邊的括號不可少,如缺少括號則表示是指針數(shù)組(本章后面介紹),意義就完全不同了。 來源:www.examda.com
     [Explain]main(){
     static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
     int(*p)[4];
     int i,j;
     p=a;
     for(i=0;i<3;i++)
     for(j=0;j<4;j++) printf("- ",*(*(p+i)+j));
     }
     ’Expain字符串指針變量的說明和使用字符串指針變量的定義說明與指向字符變量的指針變量說明是相同的。只能按對指針變量的賦值不同來區(qū)別。 對指向字符變量的指針變量應(yīng)賦予該字符變量的地址。如: char c,*p=&c;表示p是一個(gè)指向字符變量c的指針變量。而: char *s="C Language";則表示s是一個(gè)指向字符串的指針變量。把字符串的首地址賦予s。 來源:www.examda.com
     請看下面一例。
     main(){
     char *ps;
     ps="C Language";
     printf("%s",ps);
     }
     運(yùn)行結(jié)果為:
     C Language
     上例中,首先定義ps是一個(gè)字符指針變量, 然后把字符串的首地址賦予ps(應(yīng)寫出整個(gè)字符串,以便編譯系統(tǒng)把該串裝入連續(xù)的一塊內(nèi)存單元),并把首地址送入ps。程序中的: char *ps;ps="C Language";等效于: char *ps="C Language";輸出字符串中n個(gè)字符后的所有字符。
     main(){
     char *ps="this is a book";
     int n=10;
     ps=ps+n;
     printf("%s\n",ps);
     }
     運(yùn)行結(jié)果為:
     book 在程序中對ps初始化時(shí),即把字符串首地址賦予ps,當(dāng)ps= ps+10之后,ps指向字符“b”,因此輸出為"book"。
     main(){
     char st[20],*ps;
     int i;
     printf("input a string:\n");
     ps=st;
     scanf("%s",ps);
     for(i=0;ps[i]!=’\0’;i++)
     if(ps[i]==’k’){
     printf("there is a ’k’ in the string\n");
     break;
     }
     if(ps[i]==’\0’) printf("There is no ’k’ in the string\n");
     }
     本例是在輸入的字符串中查找有無‘k’字符。 下面這個(gè)例子是將指針變量指向一個(gè)格式字符串,用在printf函數(shù)中,用于輸出二維數(shù)組的各種地址表示的值。但在printf語句中用指針變量PF代替了格式串。 這也是程序中常用的方法。
     main(){
     static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
     char *PF;
     PF="%d,%d,%d,%d,%d\n";
     printf(PF,a,*a,a[0],&a[0],&a[0][0]);
     printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);
     printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);
     printf("%d,%d\n",a[1]+1,*(a+1)+1);
     printf("%d,%d\n",*(a[1]+1),*(*(a+1)+1));
     }