簡體   English   中英

字符串的指針數組(指針的基本類型)

[英]Array of pointers to strings(base type of pointers)

int main(){
int i;
char *names[]={"pankaj",
               "anshul",
               "dheeraj",
               "rahul"
               };
for(i=0;i<4;i++)
    printf("\n%u",names[i]);}

當我對此進行編碼時,我發現所有字符串都以連續的方式排列。 對於前。 如果names [0] = 436,那么names [1] = 443,names [2] = 450,names [3] = 458,因此所有字符串都以連續的方式分配了內存,其中\\ 0作為字符。 但是可以在任何地方為字符串分配內存,並且它們的基地址存儲在指向這些字符串的指針數組中。 不應該那樣嗎? 此外聲明的數組中這些指針的基本類型是什么? 它們是指向char的 指針還是指向字符串的指針。**類似於這些char(* p)[6]類型的指針數組還是char * p類型的指針數組。 我們可以使用以下名稱數組來處理整個字符串,例如:

int main()
{
char *names[]={"pankaj",
               "anshul",
               "dheeraj",
               "rahul"
               };
char *temp;
printf("Original:%s%s\n",names[2]names[3]);
temp=names[2];
names[2]=names[3];
names[3]=temp;
printf("New:%s%s",names[2],names[3]);
return 0;
}

在這種情況下,我只需交換指針數組的字符串的基地址,就可以反轉dheerajrahul (整體)字符串的位置。 通過它,指針似乎是指向字符串類型的指針,即指針指向整個字符串,而不是僅指向字符串的第一個字符。 因此,如果它們不是指向字符串的指針,而是僅指向char的指針; 指向它們各自字符串的第一個字符,我們如何通過僅交換指針數組中dheerajrahul的基地址來交換整個字符串。

文字字符串實際上是一組只讀字符(包括空終止符)。 與其他數組一樣,它們會衰減到指向其第一個元素的指針。 您的數組names是一個指針數組,每個指針都初始化為指向文字字符串的第一個元素(第一個字符)的指針。

交換names的元素時,僅交換指針。

您可以使用"%p"格式說明符進行打印,從而輕松地檢查指針本身:

printf("names[2] = %p, names[3] = %p\n", (void *) names[2], (void *) names[3]);

如果在交換之前和之后進行此操作,您將看到指針已在數組中交換。 文字字符串本身的內容仍將相同。

指針交換之前,數組看起來像這樣:

+----------+
| names[0] | -----> "pankaj"
+----------+
| names[1] | -----> "anshul"
+----------+
| names[2] | -----> "dheeraj"
+----------+
| names[3] | -----> "rahul"
+----------+

指針交換后,數組如下所示:

+----------+
| names[0] | -----> "pankaj"
+----------+
| names[1] | -----> "anshul"
+----------+
| names[2] | -\ /-> "dheeraj"
+----------+   x
| names[3] | -/ \-> "rahul"
+----------+

字符串本身的位置仍然相同。 只是更改了數組names的內容。


作為一個小小的注解,由於C中的文字字符串是只讀的,因此您應該真正將它們視為常量,並使用const char *指向它們的指針。

C沒有這樣的string數據類型-在C中,字符串只是字符值的序列,包括零值終止符。 字符串(包括字符串文字)存儲為字符類型的數組(“寬”字符串為charwchar_t )。

除非它是的操作數sizeof或一元&運營商,或者是用於初始化在聲明的字符陣列,類型的表達式文字串“ N的-元素陣列T ”被轉換(“衰變”)來表達類型為“指向T指針”,表達式的值是數組第一個元素的地址。

因此,鑒於您的聲明:

char *names[]={"pankaj",
               "anshul",
               "dheeraj",
               "rahul"
               };

每個字符串文字( "pankaj""anshul"等)的類型為“ N char元素數組”,其中N是每個字符串的長度加1(需要一個額外的元素來表示0終止符)。 每個文字都作為數組存儲在內存中,以便在程序的整個生命周期內都可用。 連續分配它們並不奇怪,但這並不值得指望。 字符串文字應該是不可變的,但是嘗試修改字符串文字內容的行為是不確定的 -它可能起作用,可能不會,可能會出現運行時錯誤,可能不會,等等。

因為它們不是sizeof或一元&運算符的操作數,並且由於它們沒有用於初始化字符數組,所以每個文字表達式都從類型“ N char元素數組”轉換為“指針”(“衰減”)到char “( char * ),並且每個文字表達式的值都是字符串中第一個字符的地址。 這些指針值是數組中實際存儲的值。

如果您聽到有人在C中引用指向字符串的指針,那么他們真正的意思是指向char的指針,該指針指向字符串的第一個字符。

因此,總結一下:

  • names是指向char的指針的數組
  • 除非它是sizeof或一元&運算符的操作數,否則表達式 names將衰減為指向charchar ** )指針的指針,並且表達式的值將為數組第一個元素的地址
  • 每個names[i]類型均為char * (指向char指針)
  • 每個names[i]在初始化程序中存儲每個字符串的第一個字符的地址
  • 每個字符串文字的內容都存儲在“某處”,以便在程序的整個生命周期內都可用
  • 嘗試修改字符串文字的內容將調用未定義的行為-可能按預期運行,可能無法運行,可能會出現運行時錯誤,可能無法運行,等等。

您的第二個代碼片段僅在指針周圍交換,而不是字符串內容-字符串本身未修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM