[英]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;
}
在這種情況下,我只需交換指針數組的字符串的基地址,就可以反轉dheeraj和rahul (整體)字符串的位置。 通過它,指針似乎是指向字符串類型的指針,即指針指向整個字符串,而不是僅指向字符串的第一個字符。 因此,如果它們不是指向字符串的指針,而是僅指向char的指針; 指向它們各自字符串的第一個字符,我們如何通過僅交換指針數組中dheeraj和rahul的基地址來交換整個字符串。
文字字符串實際上是一組只讀字符(包括空終止符)。 與其他數組一樣,它們會衰減到指向其第一個元素的指針。 您的數組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中,字符串只是字符值的序列,包括零值終止符。 字符串(包括字符串文字)存儲為字符類型的數組(“寬”字符串為char
或wchar_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
將衰減為指向char
( char **
)指針的指針,並且表達式的值將為數組第一個元素的地址 names[i]
類型均為char *
(指向char
指針) names[i]
在初始化程序中存儲每個字符串的第一個字符的地址 您的第二個代碼片段僅在指針周圍交換,而不是字符串內容-字符串本身未修改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.