簡體   English   中英

定義char和int時指針有什么區別?

[英]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";

在直接分配指針變量時,是什么讓我感到困惑,它會自動獲取地址嗎?

是。

看一下8.5.2 c ++文檔的字符數組

雖然理論上第一個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.

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