簡體   English   中英

初始化char * vs int *

[英]Initializing char* vs int*

這在C ++中是可能的:

const char* ch = "hello";

但是這樣的事情是不可能的:

int* i = { 1, 2, 3 };

char *chint* 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]1i[1]2i[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.

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