C語言奇妙之旅_指針數組

指針數組概念

        一個數組的元素值爲指針則是指針數組。 指針數組是一組有序的指針的集合。

一般形式

        數據類型 * 數組名[數組長度]

例如  

/*
* 編寫時間:  2018/8/3
* 編寫作者: 流光飛霞
* 程序功能:  指針數組
* 程序版本:  V0.1.00
**/

# include <stdio.h>

int main()
{
    int a[3][4] = 
         {
             {1, 2, 3, 4},
             {5, 6, 7, 8},
             {9, 10, 11, 12}
         };
    int * p = { a[0], a[1], a[2] };
    int * q = { a[0] };
    int i;

    for ( i = 0; i < 3; i++ )
    {
        printf ("%d, %d, %d\n", a[i][2-1], *a[i], *(*a+i)+i);
    }
    for ( i = 0; i < 4; i++ )
    {
        printf ("%d, %d, %d\n", p[i], q[i], *(p+i) );
    }
    

    return 0;
}

q是一個指針數組, 三個元素分別指向二維數組a的各行。 然後用for循環輸出制定的數組元素。 

 

指針數組可以作爲函數的參量使用,使用方式與普通數組類似。

指針數組常適用於指向若干字符串,這樣使字符串處理更加靈活方便。

 

數組指針

           

#include <stdio.h> 

int main(void)
{ 
    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
    int (*p)[2] = (int (*)[2])a; 
    /*
        等號左邊:聲明並定義指針p爲數組指針,指向的數組長度爲2;
        等號右邊:a爲地址(&a也一樣,僅僅是值一樣)賦給p,(int (*)[2])爲強制類型轉換,將a 
        轉換爲和p一樣的類型;
    **/

    printf("%d\n", **p); //輸出結果是:1 (*p是p指向數組的首地址,*(*p)是首地址內存放的內容)

    printf("%d\n", **(*p+1)); //輸出結果是:2(*p是p指向數組的首地址,*(*p+1)是數組的第二個元素地址內存放的內容)

    printf("%d\n", **(p+1)); /* 
                                 輸出結果是:3 (p+1指向的的2元素數組爲p指向2元素數組的下                         一個數組,*(p+1)是p+1指向的數組的首地址內存放的內容) 
                             **/

    printf("%d\n", *a); //輸出結果是:1 (a爲數組的首地址,首地址的內容)

    return 0; 
} 

/*
原文地址: http://blog.sina.com.cn/s/blog_605f5b4f0100x7jq.html
*/
#include <stdio.h> 

int main(void)
{ 
    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
     int (*p)[2] = (int (*)[2])&a;  //a是數組首地址。 &a是指向數組的指針 
 
    printf("%d\n", **p); //輸出結果是:1
    printf("%d\n", *(*p+1)); //輸出結果是:2
    printf("%d\n", **(p+1)); //輸出結果是:3
    printf("%d\n", *a); //輸出結果是:1
    printf("%d\n", *(a+1));  //輸出結果是:2
    printf("%d\n", *(a+9)); //輸出結果是:10
    printf("%d\n", *(a+10)); //輸出結果是:1244948是0012FF14的十進制表示方式,a+10超出了數組a的數組界限,*(a+10)返回的是數組的首地址
    printf("%p\n", *(a+10)); //輸出結果是:0012FF14
    printf("%p\n", a);  //輸出結果是:0012FF14,數組首地址
    printf("%p\n", &a); //輸出結果是:0012FF14 指向數組的指針,內存的是數組的地址
    printf("%d\n", *(&a)); //輸出結果是:1244948
    printf("%d\n", **(&a)); //輸出結果是:1,*(&a)得到的是數組的地址,**(&a)是數組裏面存的元素
    printf("%d\n", *(&a+1)); //輸出結果是:1244988,&a+1是下一個10元素的int類型數組, *(&a+1)是下一個10元素int數組的地址,可以看到它比*(&a)大了40個字節=int的4個字節*10個int
    printf("%p\n", *(&a+1)); //輸出結果是:0012FF3C 是 1244988的16進製表示

    return 0; 
}

/*
原文地址: http://blog.sina.com.cn/s/blog_605f5b4f0100x7jq.html
*/

以上兩個程序是看了別人的博客"偷"來的, ↓面是鏈接, 有點懶了                  熬夜成癮(,,•﹏•,,)

http://blog.sina.com.cn/s/blog_605f5b4f0100x7jq.html

 

數組指針是指向數組地址的指針,其本質爲指針;

指針數組是數組元素爲指針的數組(例如 int *p[3],定義了p[0],p[1],p[2]三個指針),其本質爲數組。

數組指針的使用在某些情況下與指針數組很相似,要注意區別。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章