簡體   English   中英

指針和數組-C ++

[英]Pointers and arrays - c++

我不知道為什么以下內容可以在c ++中工作

 int main() {
  function("hello world");
     return 0;
 }

 void function(char *ch) {
  cout << ch;
 }

指針如何指向整個字符串? 我要指出的是數組中的第一個元素。

char*是一種類型。 它的值是一個內存地址-機器內存的單位。 該存儲器字節中包含的值是一個字符。 該地址之外有更多的內存,依次包含更多字符。

告訴cout輸出char* (而不是char )告訴它cout不僅輸出它指向的直接內存地址,而且輸出超出它的所有內容,直到值\\0

你是對的。 指針指向數組中的第一個元素。 但是再一次,由於chchar *類型,並且您嘗試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.

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