C語(yǔ)言程序設(shè)計(jì)(第6章指針)7

字號(hào):

6.7 指向指針的指針
    一個(gè)指針變量可以指向整型變量、實(shí)型變量、字符類型變量,當(dāng)然也可以指向指針類型變量。當(dāng)這種指針變量用于指向指針類型變量時(shí),我們稱之為指向指針的指針變量,這話可能會(huì)感到有些繞口,但你想到一個(gè)指針變量的地址就是指向該變量的指針時(shí);這種雙重指針的含義就容易理解了。下面用一些圖來描述這種雙重指針,見圖6 - 1 3。
     在圖中,整型變量i的地址是& i,將其傳遞給指針變量p,則p指向i;實(shí)型變量j的地址是& j,將其傳遞給指針變量p,則p指向j; 字符型變量c h的地址是&ch,將其傳遞給指針變量p,則p指向ch; 整型變量x的地址是&x,將其傳遞給指針變量p2,則p2指向x,p2是指針變量,同時(shí),將p2的地址&p2傳遞給p1,則p1指向p2。這里的p 1就是我們談到的指向指針變量的指針變量,即指針的指針。
     指向指針的指針變量定義如下:
    類型標(biāo)識(shí)符* *指針變量名
    例如: float **ptr;
    其含義為定義一個(gè)指針變量ptr,它指向另一個(gè)指針變量(該指針變量又指向一個(gè)實(shí)型變量)。由于指針運(yùn)算符"*"是自右至左結(jié)合,所以上述定義相當(dāng)于:
    float *(*ptr);
    下面看一下指向指針變量的指針變量怎樣正確引用。
    [例6-27] 用指向指針的指針變量訪問一維和二維數(shù)組。
    #include
    #include
    main( )
    {
     int a[10],b[3][4],*p1,*p2,**p3,i,j; /*p3 是指向指針的指針變量* /
     for(i = 0; i < 10; i ++)
     scanf("%d", &a[i]); / *一維數(shù)組的輸入* /
     for(i=0;i<3;i++)
     for(j = 0; j < 4; j ++)
     scanf("%d", &b[i][j]); / *二維數(shù)組輸入* /
     for(p1=a,p3=&p1,i=0;i<10;i++)
     printf("%4d", *(*p3 + i )); / *用指向指針的指針變量輸出一維數(shù)組* /
     printf("\n");
     for(p1=a;p1-a<10;p1++) /* 用指向指針的指針變量輸出一維數(shù)組* /
     {
     p3 = &p1;
     printf("%4d",**p3);
     }
     printf("\n");
     for(i = 0; i < 3; i ++) /* 用指向指針的指針變量輸出二維數(shù)組* /
     {
     p2 = b[i];
     p3 = &p2;
     for (j=0;j<4;j++)
     printf("%4d", *(*p3+j));
     printf("\n");
     }
     for(i=0; i<3; i++) /* 用指向指針的指針變量輸出二維數(shù)組* /
     {
     p2 = b[i];
     for( p2 = b[i]; p2 - b[i] < 4; p2++)
     {
     p3 = &p2;
     printf("%4d", **p3);
     }
     printf("\n");
     }
    }
     程序的存儲(chǔ)示意如圖6 - 1 4所示,對(duì)一維數(shù)組a來說,若把數(shù)組的首地址即數(shù)組名賦給指針變量p1,p1就指向數(shù)組a,數(shù)組的各元素用p1表示為, *(p1 + i),也可以簡(jiǎn)化為*p1 + i表示。
     如果繼續(xù)作將p3 = &p1,則將p1的地址傳遞給指針變量p3,*p3就是p1。用p3來表示一維數(shù)組的各元素,只需要將用p 1表示的數(shù)組元素*(p1 + i)中的p1換成*p3即可,表示為*(*p3 + i)。
    圖6-14 例6-27程序的存儲(chǔ)示意圖
     同樣,對(duì)二維數(shù)組b來說,b[i]表示第i行首地址,將其傳遞給指針變量p2,使其指向該行。該行的元素用p 2表示為*(p2+i)。若作p3 = &p2,則表示p3指向p2,用p3表示的二維數(shù)組第i行元素為:*(*p3 + i)。這與程序中的表示完全相同。
    運(yùn)行程序:
    1 2 3 4 5 6 7 8 9 0
    1 3 5 7
    2 4 6 8
    5 7 9 2
    1 2 3 4 5 6 7 8 9 0
    1 2 3 4 5 6 7 8 9 0
    1 3 5 7
    2 4 6 8
    5 7 9 2
    1 3 5 7
    2 4 6 8
    5 7 9 2
    [例6-28] 利用指向指針的指針變量對(duì)二維字符數(shù)組的訪問。
    #include
    #include
    main( )
    {
     int i;
     static char c[][16]={"c language","fox","computer","home page"};