[英]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.