[英]Passing character arrays in C++
在傳遞用於通過其地址引用字符串的字符指針(即直接通過其名稱或&name[0]
)時,必須傳遞原始字符串,因為我們通過地址進行傳遞。
但是,在執行以下代碼后,我為第一個元素獲得了兩個不同的address值,令人驚訝的是,它們之間相隔2個字節。
另外,在函數中修改字符串的內容並沒有更改傳遞的數組的內容,但這是因為新的字符串會生成新的地址,對嗎?
但是,關於第一個元素的地址不同,那怎么可能呢?
#include<conio.h>
#include<stdio.h>
#include<iostream.h>
void fn(char *arr)
{
cout<<endl<<&arr;
arr="hi";
}
void main()
{
clrscr();
char *arr="hey";
cout<<endl<<"main "<<&arr;//the address is different from that in fn
fn(arr);
cout<<endl<<arr;
}
您要通過value傳遞一個指針 ,然后比較指針和副本的地址,這當然是不同的。 如果要檢查它們是否指向相同的內存地址,可以執行以下操作:
std::cout << (void*)arr << std::endl;
修改函數中字符串的內容,未更改傳遞的數組的內容
您不是在修改字符串的內容,而是在重新分配指針的副本以指向不同的字符串文字。 還要注意,修改指向的內存(文字)將是未定義的行為。
編譯器允許代碼通過(即編譯它)的唯一原因是具有向后兼容功能,該功能使您可以擁有一個char*
,該char*
指向字符串(即const char[]
類型)的內容。 您應該有一個警告,應該避免這樣做。
僅供參考。 我無法評論有關傳遞字符數組的類似問題,因為它已作為重復項關閉,但是該問題相當重要,因此希望您不必介意我是否交叉發布。
在生產應用程序中使用字符串時,通常會使用UTF-8,因為它無需花費很多精力即可大大增加市場。
http://www.joelonsoftware.com/articles/Unicode.html
大多數應用程序還使用字符串類來封裝字符。 然后,您可以使用類似:
無效fn(...,const std :: string&static_string,...);
在您的標題中。 如果使用類似gettext的庫,則代碼如下所示:
printf(gettext(“突然之間有一行是好的..”));
英文字符串是本地化文件的直觀索引,您可以在安裝或運行時快速輕松地切換語言。
如果由於使用C而不能使用類,則gettext文檔也將涉及這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.