程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 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型指針,就是可以放任何類型變量的地址。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved