簡體   English   中英

char *和char(*)之間的區別[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的數組的指針,因此這些類型不同,並且編譯器正確地發出警告。

此外,由於&strstr數組的地址並且類型為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.

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