char* r(char *g){ // can someone explain this line for me? I'm not sure what is it saying
聲明一個函數,其中r
採用一個參數,指針g
包含的一個或多個字符的地址。
char ch = 'B';
聲明一個變量,char
類型的ch
並給它分配一個值 'B'。也就是 - 它將包含一個數字,它是字母B的ASCII圖表中的位置。它將包含數字 66,但是當您打印出來時,它將生成字母'B'。 (請參閱http://www.asciitable.com/)
此變量可能位於堆棧上。它可能在一個寄存器中,但編譯器通常很聰明,下一行將確保它在堆棧中。
return &ch;
在此背景下,&
是address of
運算符。
return address_of(ch);
由於ch
是char
類型,&ch
產生一個值,該值是char*
類型。
char* a;
聲明變量a
沒有初始值。這對於進入寫作習慣來說是件壞事。
a = new char[strlen(b)];
你說b
不存在,但我認爲這是假定爲char*
類型 - 一個指向一個或多個字符。在C和C++中,「C-String」是一個由char值(字符)結尾的char數組(不是字符'0',其值爲48,但爲0或'\' 0' )。這被稱爲'終止nul'或'nul字符'或'nul字節'。
字符串"hello"
實際上可表示爲數組{ 'h', 'e', 'l', 'l', 'o', 0 }
。與"hell0"
對比,這將是{ 'h', 'e', 'l', 'l', '0', 0 };
函數strlen
計算從它被調用的地址開始的字符數,直到找到一個nul。如果b是「hello」的地址,strlen將返回5.
new爲對象分配內存,或者在這種情況下爲char類型的對象數組,其數目是strlen的返回值。
size_t len = strlen(b);
char* a = new char[len];
在代碼中的這一點,記得我的解釋關於終止NUL和strlen的它找到0要存儲一個C字符串,你需要的字符PLUS空間數之前返回字符數量用於終止NULL。
如果b
是字符串「A」,它包含一個字符('A'),但包含兩個* char * s - 'A'和0. Strlen返回字符數。
strcpy(a, b);
這將複製的字符指向b
的地址在a
,*包括終止NUL。
這裏的錯誤是你只給字符分配了足夠的內存。
char* a = new char[strlen(b) + 1];
strcpy(a, b);
再次 - strlen的總是要返回長度 - 字符數,而你總是會想比一個多,爲NUL。
會是正確的 - 否則你會覆蓋分配給你的內存並導致損壞。
--- --- EDIT
投擲一些這一起,現場演示這裏:http://ideone.com/X8HPxP
的#include 的#include
INT主(){ 炭一個[] = 「你好」; std :: cout < <「a start as [」< < a < <「] \ n」;
// C/C++ arrays are 0-based, that is:
a[0] = 'H'; // changes a to "Hello"
std::cout << "a is now [" << a << "]\n";
std::cout << "strlen(a) returns " << strlen(a) << "\n";
// But that is based on counting characters until the 0.
a[3] = 0; // one way to write it,
a[3] = '\0'; // some people prefer writing it this way.
std::cout << "a changed to [" << a << "]\n";
std::cout << "strlen(a) is now " << strlen(a) << "\n";
return 0;
}
謝謝回答。所以你說第一個代碼沒有錯?我不應該使用char * ch ='B'而不是char ch ='B'對嗎?對於第二個,你怎麼知道你需要多少內存?我的意思是你怎麼知道要補充多少? – rullzing
'char ch ='B''是正確的,因爲''B''是'char'。如果你想要一個char指針,你需要使用'&'運算符,就像下一行那樣('return &ch;')。如果你想使它成爲'char * b =',你需要做'char * b = &'B';'。 ''B'是一個字符,並且(在這個contxt中)'&'意味着'地址','char *'意味着'類型地址變量'。對於額外的內存大小,請參閱上面添加「---編輯---」的位置。 – kfsone