1. 程式人生 > >C語言中字元陣列和字串指標分析

C語言中字元陣列和字串指標分析

    這幾天搞Unix上的C程式,裡面用到了很多字元陣列和字串指標,我記得在學完C語言後相當一段時間裡,對指標這個東西還是模模糊糊,後來工作也沒怎麼用到過C,雖然網上這類的文章也有很多,還是決定自己在這做個小總結,也算加深下自己的印象,寫了下面的測試程式:

#include <stdio.h>

int main(int argc, char *argv[])
{

  char day[15] = "abcdefghijklmn";
  char* strTmp = "opqrstuvwxyz";

  printf("&day is %x\n",&day);
  printf("&day[0] is %x\n",&day[0]);
  printf("day is %x\n",day);
  
  printf("\n&strTmp is %x\n",&strTmp);
  printf("&strTmp[0] is %x\n",&strTmp[0]);
  printf("strTmp is %x\n",strTmp);
  
  getchar(); 
  return 0;
}

執行後螢幕上得到如下結果:



其實看到結果估計很多東西就好明白了,

    先看看前三個輸出也就是關於變數day的,在 char day[15] = "abcdefghijklmn"; 這個語句執行的時候,系統就分配了一段長15的記憶體,並把這段記憶體起名為day,裡面的值為"abcdefghijklmn",如下圖所示:

        再看程式,第一個輸出,&day,&號是地址運算子,也就是day這個變數的記憶體地址,很明顯,在最前面,也就是a字元所在位元組的地址;
        對於第二個輸出也就好理解了,&day[0],就是day陣列中第一個變數(也就是a)的地址,因此他們兩個是一樣的;
        第三個輸出是day,對於陣列變數,可以使用變數名來索引變數中的內容,其實這裡的day可以理解成陣列變數退化的指標,並且指向陣列的開頭,既然把它理解成指標,那麼它的值肯定是地址了,所以他的值和上面兩個也一樣。

    再看看後面三個輸出,關於字串指標strTmp,在執行char* strTmp = "opqrstuvwxyz";後,記憶體的圖示如下:



如圖所示,記憶體分配了兩段記憶體,一個名為strTmp,型別是一個字元指標,另外一段是一個字串常量,且strTmp裡面存放著字元常量的首地址,注意這裡無法通過strTmp修改這段字串,因為是常量;於是程式中的後面三個輸出就好理解了;
    
  &strTmp:strTmp這個字元指標的地址
  &strTmp[0]:strTmp所指字元常量第一個字元的地址
  strTmp:strTmp這個字元指標的值,即字元常量的首地址

因此,最後兩個的值是一樣的。
      指標可以這樣理解,指標這種型別,和int,char,double等等是一樣的,只是它用來儲存地址值的,而int變數儲存整數,char變數儲存字元,僅此而已,就char型指標或者int指標,本質是一樣的,都是存放的地址,只不過那個地址所裡面的變數型別不同而已,還有一種void型指標,就是可以放任何型別變數的地址。