[英]What is difference between char* and int* data type to create array of pointers in C++?
[英]What is the difference in pointers when defining char and int?
我理解指針如何工作的基礎知識,但以下示例讓我感到困惑。
int *myNum = 10; // Produces an error
char *myChar = "Something"; // Works fine
為什么分配char工作但整數不工作(可能導致char被視為數組)?
在直接分配指針變量時,是什么讓我感到困惑,它會自動獲取地址嗎?
char *myChar = "Something";
和
char myChar = "Something";
char *charAddr = &myChar;
這里有什么不同,或等於?
"Something"
基本上是:
static const char some_hidden_array[] = {'S', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g', '\0'};
some_hidden_array
也就是說,當您編寫"Something"
,編譯器會在幕后生成一個數組,並為您提供指向該數組開頭的指針。 由於這已經是一個指向char的指針,因此將它分配給“指向char的指針”類型的變量(寫為char*
)沒有問題。
10
對於類似的東西來說並不缺乏。 它只是數字10 - 它不是指向包含數字10的數組的指針,或類似的東西。
請注意, char
是單個字符 ,而不是字符串,這就是為什么字符串語法與大多數其他類型相比是不尋常的 - 字符串是幾個字符,而不僅僅是一個字符。 如果你嘗試使用普通的舊char
,你會看到同樣的事情:
char *myChar = 'a'; // error
或任何其他類型:
float *myFloat = 42.1f; // error
換句話說, 10
給出錯誤並不奇怪 - 如果有的話,奇怪的是"Something"
沒有 。 (至少,在知道字符串文字是如何工作之前,這很奇怪)
這是一回事(編譯器沒有出現任何魔法)。 默認情況下,像10這樣的文字是int值,而不是int *。
你需要施放:
int *myNum = (int*)10; // Need to cast
char *myChar = "Something"; // No need to cast "..." is already a char*
請注意,引用指向絕對值的指針是很危險的,因為最終會在CPU內存中找到地址10。
關於你的第二個問題,“...”在內存中被視為一個連續的char序列,類似於數組,相當於char *。
為了深入理解C,數組和指針之間的指針和差異,你應該閱讀:專家C編程:Peter van der Linden的深層C秘密。
當你做char *myChar = "Something";
,在內存中的某處創建一個只讀字符串文字,以空字符結尾。 現在這對於編譯器來說是特殊的,它解釋了一連串存儲的'char'變量,並以null字符作為字符串結尾。 所以基本上你創建了一個字符數組,當你執行*myChar*
,它返回字符串。
對於整數或任何其他數據類型,它將int *ptr
分為指向整數的指針,將int ptr
為整數。 您收到錯誤可能是因為您輸入的地址可能無效/可用。
另外,做
char myChar = "Something"; //this is an error, since char can hold one character
char *charAddr = &myChar;
請注意, myChar
和&myChar
是相同的,因為myChar
是一個指針!
編輯:請參閱此處有關字符串文字: 是否可以在C中修改字符串?
為什么分配char工作但整數不工作(可能導致char被視為數組)?
你是對的, "Something"
是一個字符串文字,可以被視為char數組。 在char *myChar = "Something";
發生以下情況:它被分配長度+ 1個字節的內存,其中"Something"
將被存儲, myChar
指向該內存的起始地址。 字符串文字有點特殊。
以下是使用常量值初始化數組的一般方法:
// valid initializations;
char s2[] = { 'a', 'b', 'c' };
int a[] = { 1, 2, 3 };
char s1[] = "123";
在直接分配指針變量時,是什么讓我感到困惑,它會自動獲取地址嗎?
是。
雖然理論上第一個int *myNum = 10
是有道理的 - 特別是如果你知道在地址10處有一個有用的int
- 一般來說它很少有用並且可能非常危險。
但是,有一些指針分配廣泛使用且非常安全:
int *myNum = 0;
在99.9%以上的現代CPU架構中,這與之相同
int *myNum = NULL;
看到空的定義<stddef.h>
這里 。
作為一般規則,指針變量的賦值最好通過設置其他內容的地址來完成。
int k, *p = &k;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.