[英]What is the difference between char word[25]; and char word[25] = “”;?
[英]Difference between char * and char (*)[25]
#include<stdio.h>
int main()
{
char str[25] = "Hello World";
printf("%s\n", &str+2);
printf("%p\n",&str);
printf("%p\n",&str+2);
return 0;
}
上面的程序在第6行閃爍了一個錯誤,說:
warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[25]’ [-Wformat=]
我想知道兩者之間有什么區別。 並且輸出始終顯示兩個地址,它們之間的差值為32字節。 當我嘗試打印str
地址和str
+2的地址時,我期望輸出的差異為2。 你可以解釋嗎?
這兩種情況的區別非常簡單。 假設我們有一個由25個字符組成的數組: char arr[25];
。 按照慣例,表達式arr
計算指向第一個數組元素的指針,即arr
與&arr[0]
。 注意,這里一元運算符&
應用於具有char
類型的左值arr[0]
。 結果&
給出了一個char *
類型的表達式(即char
指針)
當我們說&arr
左值是arr
時,即為char [25]
(即25個字符的數組)。 結果,整個表達式的類型為char (*)[25]
(即,指向25個字符的數組的指針)。 因此,我們得到的表達式完全是另一種類型,與char *
不兼容。
關於索引的一些注釋。 &arr + 2
和&arr
之間的差為50個字節(十六進制為0x32),因為sizeof(arr) == 25
。
char *
是指向char
的指針,而char (*)[25]
是指向25個char
的數組的指針,因此這些類型不同,並且編譯器正確地發出警告。
此外,由於&str
是str
數組的地址並且類型為char (*)[25]
,所以&str+2
的值將等於:
&str + 2*sizeof(char (*)[25]) = &str + 2*25 = &str + 50 = &str + 0x32
由於指針根據其指向的類型遞增。
編輯:OP添加了新行6。
這是打印字符串和指針值的正確語法。 在所有情況下,在&
處都不應出現&
,因為對數組標識符的引用會將其衰減為指針。
#include <stdio.h>
int main()
{
char str[25] = "Hello World";
printf("%s\n", str+2);
printf("%p\n", (void*)str);
printf("%p\n", (void*)(str+2));
return 0;
}
程序輸出:
llo World
0018FF20
0018FF22
編輯2:這顯示了傳遞數組的指針的效果。 編譯器認為您正在處理每個大小為25的字符串數組的第三個元素。我試圖說明這種未定義的行為是如何實際體現的。
#include <stdio.h>
int main()
{
char str[25] = "Hello World";
char abc[] = "abcdefghijklmnopqrstuvwxyz";
printf("%s\n", &str+2);
return 0;
}
程序輸出:
wxyz
經過一番研究,我得出了這個解釋。 &str+2
被視為指向數組的指針。 char (*)[25]
說這是一個指向大小為25的字符數組的指針。要找到導致輸出顯示32字節差的原因的解釋,我再次運行程序,注意到輸出以十六進制顯示,即
0x7ffd865b2710
0x7ffd865b2742
當轉換為基數10時,它變為50字節的差,這是指向位於當前數組第二位的數組的指針(記住&str + 2)。 為了更加清楚,這是一個小內存圖。
&str -----> current array ie str. array is 25 bytes long.
&str+1 -----> array lies after 1 position to current array. This address is 25 bytes away from &str.
&str+2-----> array lies after 2 position to current array. This address is 50 bytes away from &str.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.