[英]'initializing' : truncation from 'int' to 'char'
[英]Initializing char* vs int*
這在C ++中是可能的:
const char* ch = "hello";
但是這樣的事情是不可能的:
int* i = { 1, 2, 3 };
char *ch
和int* i
都是普通的指針。 為什么char*
可以分配多個字符而int*
不能分配多個整數?
我知道我們可以使用
int x[] = {1, 2, 3};
但這不是問題。
const char* ch = "hello";
有點像
static const char string_literal[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
const char* ch = &string_literal[0];
除了每個相同的字符串文字不一定指向內存中的不同位置。
對於任何其他類型也是如此:
static int integer_list[] = { 1, 2, 3 };
int* i = &integer_list[0];
// or equivalently, just int* i = integer_list;
現在, i[0]
為1
, i[1]
為2
, i[2]
為3
。
字符串文字有一種特殊的語法,因為它們經常被使用,並且在上下文中經常使用虛擬變量使代碼混亂。
如果你有很多使用靜態分配的整數類型只讀數組的代碼,你可以使用模板隱藏樣板:
template <int a, int b, int c>
struct int_array { static const int values[3]; };
template <int a, int b, int c>
const int int_array<a, b, c>::values[] = { a, b, c };
您只需要定義一次模板,然后每個不同的用戶都可以將該模板用於用戶感興趣的特定值。
const int* i = int_array<1, 5, 6>::values;
通常,簡單地定義單獨的數組變量會更容易,但在某些情況下,這樣的模板會有所幫助。
正如評論中所指出的,可以更一般地定義模板,以便它適用於任意類型和任意長度的數組,但它需要一個最新的編譯器,對當前版本的C ++有很好的支持(對於GCC)和clang,當前版本沒問題,但請確保傳遞-std=c++11
或-std=gnu++11
選項以啟用C ++ 11功能):
template <typename T, T... v>
struct static_array {
static const T values[sizeof...(v)];
};
template <typename T, T... v>
const T static_array<T, v...>::values[sizeof...(v)] = { v... };
現在,這個數組的用戶的語法是
const int* i = static_array<int, 1, 2, 3, 4>::values;
const unsigned* j = static_array<unsigned, 1, 2, 3, 4, 5>::values;
字符串文字是一個字符數組。 請注意, ch
只是指向單個字符的指針,因此它實際上並不指向整個字符串,而只指向其基址(第一個字符的地址)。 初始化列表(即{1, 2, 3}
) 不是數組,因此不能用於初始化指針。
字符文字被編譯為二進制數據段中的一段初始化存儲。 const char *
是指向該存儲的指針。
事實上,如果只有一個內存塊的地址,應該可以為const int *
做同樣的事情。 您可以使用內聯匯編程序(但我從未嘗試過)指定.data
段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.