1. 程式人生 > >一維數組和一級指針淺析

一維數組和一級指針淺析

字符串變量 直接 理解 很好 for 字符類型 取地址 編號 char

  想要了更容易的了解指針,很好的用法就是通過數組來了解,在c裏面,感覺一維數組和一級指針的用法差不多,二維數組和二級指針的用差不多,所以通過數組來了解指針是一種很好的方法;

  數組:將相同 數據類型 的元素按一定順序排列的集合,把有限個類型相同的 變量 用一個名字命名,然後用編號區分他們的變量的集合,這個名字成為數組

  其實我們可以把數組看成是一個字符串,就像是C++中的string字符串類型的變量一樣,因為c中沒有關於字符串變量的定義,我們可以把數組看成是一個字符串吧!

  數組和字符類型是不一樣的;

  {

    char a;

    char b[64];

    a = ‘a‘;

    strcpy(b,"aaa");

  }

  就像上面這樣字符類型在空間中只分配有一個字節,而數組可以自定義的分配空間,數組寫入數據的時候也不像字符類型那樣可以直接寫入,可以通過鍵盤輸入,要麽就是像上面那樣;當然還有memcpy(),strncpy()等,這裏就不一一舉例了;

  然後上面這段代碼要是這樣寫:

  

  {

    char a;

    char b[64];

    a = ‘a‘;

    strcpy(b,"aaa");

    printf("%c\n",a);// 輸出 a

    printf("%d\n",a);//輸出 a 在ASCLL中的序號97

    printf("%d\n",&a);// 輸出a的地址不同電腦可能不一樣

    printf("%d\n",&b);//輸出地址7863796

    printf("%d\n",b);///輸出7863796

    printf("%d\n",&b[0]);//輸出地址7863796

    system ("pause");

  }

  我們發現輸出&b,b,&b[0] 竟然都是b的地址,那麽我們可不可以吧b看成是指向b首地址&b[0]的指針呢?

  {

    char b[64];

    char *c = NULL;

    c = b;// 將一維數組的地址傳遞給指針

    //或者 c = &b;

    printf("%d\n",b);

    printf("%d\n",c);

  }

  我們發現打印出來的結果是一樣的,那麽關於用法上我們也可以看看,其實這一點在數組作參數的退化問題哪裏我已經寫過了;

  {

     char a[64] = "aaaa";//直接往空間賦值了

    char *b = NULL;

    int i = 0;

    int j = 0;

    i = strlen(a);//計算字符串的個數

    b = a;//將地址傳遞給b

    //下面打印字符串,一個一個的通過下標打印

    for(j = 0 ; j < i : i++)

    {

      printf("%c ",a[i]);

     }

    putchar(‘\n‘);//換行

    

   for(j = 0 ; j < i : i++)

    {

      printf("%c ",b[i]);

    }

    //或者

    

    for(j = 0 ; j < i : i++)

    {

      printf("%c ",*(b +j));

    }

  }

  我們發現printf("%c ",a[i]);,printf("%c ",b[i]);,printf("%c ",*(b +j));三種輸出都可以將字符打印出來,效果完全一樣,所以我們可以將一級指針看成是一維數組,一維數組看成指針;但是記住這裏是看成,不能理解為是等價的;比如一級指針取地址可以傳遞給二級指針但是數組就不能。所以說如果用的話,我們可以把指針當成數組使用。

  

一維數組和一級指針淺析