天天看點

遊戲築基開發之字元串、字元指針、字元數組的相關知識梳理(C語言)遊戲築基開發之字元串、字元指針、字元數組的相關知識梳理(C語言)

遊戲築基開發之字元串、字元指針、字元數組的相關知識梳理(C語言)

該文章大部分均為轉載内容,對其進行梳理【點選跳轉】

1.為什麼可以将字元串常量指派給字元指針變量?

char *p,a='5';
p=&a;                     //正确
p="abcd";              //正确
           

原因如下:

  字元串常量的雙引号的作用:

  1. 在常量區申請記憶體儲存該字元串

  2. 在字元串的尾部加上’\0’

  3. 傳回該字元串在常量區的位址

即可以将該位址指派給一個字元指針。

2.為什麼字元串常量無法指派給字元數組?

char *p = “hello”;//正确
char p1[10];
p1 = "hello";//錯誤
char p2[10] = "hello";//正确
           

  字元串常量雙引号記錄的是該字元串常量的位址,并不是字元串常量本身。char p2[10] = “hello”;可以是因為C語言支援該初始化方式。類似于p2[0] = ‘h’,p2[1] = ’e‘…

p1 = “hello”;這樣是錯誤的,因為p1本身就是一個指針,指向大小為10個位元組的記憶體空間,類似于指針常量,其指向無法修改。即無法給指針常量指派。

TIPS:在void指針使用的時候,不能使用指針運算,應為void型編譯器不能識别類型的長度(即指針所指對象的體積),p++這樣就是不合法的,即不能進行數學運算,也不能使用*取值操作,想使用必須轉換為其它的類型。

3.對字元串常量、字元指針、字元串常量知識的整理概述

  1. 以字元串形式出現的,編譯器都會對該字元串末尾加上\0或者\000作為結束符,如在代碼中“abc”,那麼編譯器存儲的時候便是“abc\0”。
  2. “abc”一定是常量嗎?

    答案是不一定。

    ①不是常量的情況:當“abc”作為字元數組的初始值就不是,如char str[] = “abc”;因為字元數組是将字元一個一個的存放起來,編譯器解析為char str[4] = {‘a’,‘b’,‘c’,’\0‘};即如果char str[4]是一個局部變量的話,那麼便在棧區上,不是常量。

    ②常量的情況:當“abc”指派給一個字元指針變量時,如 char* ptr = “abc”;因為我們定義的是一個在棧區的普通字元指針,并沒有定義任何記憶體空間來存放字元串常量“abc”。是以編譯器把其存入記憶體中的常量區。是以即便是我們沒有寫成const char* ptr = “abc”;但是我們仍然不能操作ptr[0]=‘x’;因為ptr實際上指向的是一個常量,即ptr是一個常量指針,其指向的值不能修改。如果char* ptr = “abc”;寫在函數體内,那麼雖然這裡的"abc\0"被放在常量區中,但是ptr本身隻是一個普通的指針變量,是以ptr是被放在棧上的,而其指向在常量區,函數執行完畢ptr的記憶體空間被釋放,即在棧區的記憶體空間被釋放,但是"abc"仍然在常量區,未被釋放。

    ③字元串常量的類型可以了解為相應字元常量數組的類型。

    如"abcdef"的類型就可以看成是const char[7]

    ④對于函數參數清單中的以數組類型書寫的形式參數,編譯器把其解釋為普通的指針類型。

    如對于void func(char sa[100],int ia[20],char *p)則sa的類型為char*,ia的類型為int*,p的類型為char*。

4.為什麼字元數組可以直接指派給字元指針?

char a[10] ="hello";
char *p;
p = a;//正确
           

  char a[10]字元數組就是一個占用10個位元組的連續位址空間。其首位址儲存在a(指針常量)中。而p = a;就是将a記錄的連續位址的首位址告知p,進而p指向的值就是"hello",且其儲存了該連續位址的首位址。

繼續閱讀