簡體   English   中英

指向字符串的指針

[英]Pointers to strings

我是C編程的新手。 我對指針的混亂行為感到困惑。 特別是涉及字符串和數組時。

我知道我寫得不像

#include <stdio.h>
int main()
{
 int *number=5;
 printf("%d",*number);
} 

因為很明顯它會嘗試寫入內存的第五個位置。這會使程序崩潰。我必須初始化“數字”。

但是當談到字符串我可以這樣寫,

#include <stdio.h>
int main()
{
 char *name="xxxxx";
 printf(name);
} 

它也有效。 所以這意味着它隱式初始化“name”指針。我也知道name =&name [0]但我發現name =&name也是如此。 怎么可能? 因為,對我而言,它看起來有兩個同名的變量。 任何人都可以告訴我如何在內存中創建字符串嗎?(這一次我假設它創建名稱[0] .....名稱[n-1]和另一個名為“name”的變量(指針),在我們內部把名字[0]的位置。看到我錯了。)

PS: - 我的英語可能不太好,如果有人能給我一個關於上述事情的鏈接,那將是感激的。

與許多編程語言一樣,C支持“文字”的概念 - 特殊語法,當遇到這種語法時,會使編譯器以特殊方式創建值。

例如, -2整數文字 遇到時,編譯器會將其視為int類型的值,其內容為-2。 "..."是一個字符串文字 - 當遇到時,編譯器在一個特殊的內存區域中分配新的空間,用與你在文字中使用的字符相對應的數據填充它,在該區域的末尾添加一個0,並且最后使用指向char*類型的區域的指針作為文字表達式的結果。 所以char* s = "hello"是從類型的東西轉讓char*為類型的變量char* -完全合法的。

你在這里潛入另一個問題 - 為什么a == &a[0] 最好一次提出一個問題,但要點是a[n]*((a)+(n)) ,所以:

&a[0] == &*(a+0) == a+0 == a
 char *name="xxxxx";

這會在內存中創建一個char array (const),並將它的第一個元素的地址分配給name char *數組名稱就像指針一樣。 &name[0]表示第一個元素和name地址(在c中,cpp只是char *數組名稱也將為您提供第一個元素的地址(bcos是第一個地方分配給name的那個))也給出了同樣的結果。

符號name[i]被翻譯為*(name+i)所以你實際上有一個你添加下標的基地址name (根據指針算術計算)。 printf("%s", name)用於從起始地址打印到\\0 (附加到使用char* aka String literals創建的字符串的末尾)

檢查一下

那是因為你這些字符串實際上是字符數組。 你用line char *name = "xxxxx";做什么char *name = "xxxxx"; :您構造一個包含6個字符值的數組(其中5個為'x' ,最后一個為'\\0' )。 name是指向該數組的指針。

這就是字符串在C中通常處理的方式,你有一些字符序列,以'\\0'字符結尾,告訴像printf這樣的printf停止處理字符串。

讓我們考慮一下這段代碼:

 char *name="xxxxx";

這里發生的是字符串xxxxx被分配內存和指向該內存位置的指針 ,或者該字符串的address被傳遞給pointer變量name 。或者換句話說,您使用該地址初始化name

printf()是一個可變函數(一個帶有一個固定參數后跟一個隨機數量的參數) printf()第一個參數是const char*類型。當作為參數傳遞時,字符串標識符name表示該字符串的基地址。您可以使用

printf(name);

它只會輸出xxxxx

name=&name too. How can it be? - 這是一個合理的問題。

讓我先用現實世界的比喻來解釋。 假設你在住房社會中擁有一排房屋中的第一棟房屋。假設它的地塊編號為0其他房屋位於地塊1,2,3 ......現在假設有一個指向你房子指針 ,並且還有另一個指向整個住房社會排的指針 兩個指針不會有相同的地址,這將是plot 0嗎?這是因為指針表示單個內存位置。這是指針的type

將這個類比帶到字符串(字符數組), name標識符只表示字符串的基地址,第一個字符的地址(就像第一個字符的地址)。它在數字上與整個地址相同string,是(&name) ,在我的比喻中是house的ROW。但它們是不同的類型,一個是char*類型,另一個是char**類型。

基本上當C編譯器看到表達式時會發生什么

char *name = "xxxxx";

是,它會說。 "xxxxx"是一個常量字符串(這是一個以0字節結尾的字節數組),並將其放入生成的程序二進制文件中。 然后它會將字符串替換為內存位置,類似於:

char * name = _some_secret_name_the_compiler_only_know;

其中_some_secret_name_the_compiler_only_know是指向程序執行后字符串將存在的內存位置的指針。 並加入解析文件。

暫無
暫無

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

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