[英]Pointers and arrays - c++
我不知道為什么以下內容可以在c ++中工作
int main() {
function("hello world");
return 0;
}
void function(char *ch) {
cout << ch;
}
指針如何指向整個字符串? 我要指出的是數組中的第一個元素。
char*
是一種類型。 它的值是一個內存地址-機器內存的單位。 該存儲器字節中包含的值是一個字符。 該地址之外有更多的內存,依次包含更多字符。
告訴cout
輸出char*
(而不是char
)告訴它cout
不僅輸出它指向的直接內存地址,而且輸出超出它的所有內容,直到值\\0
你是對的。 指針指向數組中的第一個元素。 但是再一次,由於ch
是char *
類型,並且您嘗試cout
ch
,它會一直打印直到在內存中找到\\0
為止。
指針如何指向整個字符串?
由於字符串是一個數組-每個字符都位於前一個字符之后的存儲位置。 因此,指向第一個字符的指針也可以視為指向整個字符串的指針。
我要指出的是數組中的第一個元素。
是的 但是您可以對其應用指針算法(例如ch[2]
)以訪問其他元素。 這是<<
您提供指向字符的指針時所做的事情:它假定它指向一個以零結尾的數組,並打印找到的所有字符直到到達終止符。
請注意,在現代C ++中,這不應該編譯-字符串文字是常量,因此只能轉換為const char *
,而不能轉換為char *
。 較早的編譯器將允許該轉換,但應發出已被棄用的警告。 您應該始終啟用和修復編譯器警告。
除了C ++中的字符串文字是const的問題之外:
您所看到的是在C中以及在C ++中通過關聯傳遞和處理數組的常規方式。 在大多數情況下,在表達式中傳遞或使用數組時,數組會“衰減”指向其第一個元素的指針。 所以是的,您是對的:ch是第一個字符的指針。 並且所有圍繞char數組(也稱為C字符串)的C / C ++例程都依賴於以0終止的字符串。 在從給定地址開始的有效存儲區中的某個位置,值為零的字節必須指示該字符串在此邏輯上結束。 例如,當operator <<遇到零字節時,它將停止將字符從該內存復制到cout。 像strcat()這樣的函數只會覆蓋零字節,並在新的,更長的字符串現在“結束”的地方附加一個新的字節。
背景是C / C ++數組不包含任何“輔助信息”。 除了它們在內存中的裸序列之外,沒有任何與它們關聯的數據。
順便說一句,對於沒有“無效”值(例如char為0)的類型(可以用作結束標記),函數無法找到傳遞給它的數組的結尾,因為該函數會僅指向第一個元素的指針。 所有這些功能都需要第二個參數來指示數組的長度。 這種原始的數組處理(當然,在任何機器代碼中都非常快並且可以平移)與使用Ada或C#這樣更安全,更抽象的類型系統的語言有很大的不同,在這些語言中,數組承載有關其長度的信息。
"hello world"
是可以聲明為的字符數組:
char* test = "hello world";
行為類似於:
char test[] = {"hello world"};
C語言中的數組可以解釋為指針,並且指針可以指向數組。
我會向您推薦一些有關C指針的文獻。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.