簡體   English   中英

指向整數數組的Char指針

[英]Char pointer to integer array

int main()
{
    int x[] = {1, 2, 3};
    char *p = &x;
    printf("%d", *(p+1));
    return 0;
}

我在代碼塊中運行代碼,它的輸出為0。 如果II將p更改為int指針,則其給出2作為輸出。

int main() 
{    
int x[] = {1, 2, 3}; 
    int *p = &x; 
    printf("%d", *(p+1));
    return 0;
}

為什么這樣?

當將p聲明為指向char的指針時,它將指向1個字節大小的數據。 因此(p + 1) p遞增1個字節。

由於int長度至少為4個字節,因此(p + 1)可能指向1高階字節中的第二個,仍為0

如果您希望它具有相同的輸出,則可以執行類似的操作

printf("%d\n", *(p + sizeof(int)));

但是最好避免使用此類代碼,並使用-Wall標志進行編譯,這肯定會在您的情況下產生警告。

當您增加一個指針時,它會移動它所指向的對象的大小。

假設您有16位整數。 以二進制形式,數字為:0000 0000 0000 0001

一個char指針一次只能指向8位:0000 0000

從稍微不同的角度來看,關於二進制+運算符, C99標准的第6.5.6章第8段說:[強調我的]

將具有整數類型的表達式添加到指針或從指針中減去時,結果將具有指針操作數的類型。 如果指針操作數指向數組對象的元素,並且數組足夠大,則結果指向與原始元素偏移的元素,以使結果數組元素和原始數組元素的下標之差等於整數表達式 換句話說,如果表達式P指向數組對象的第i個元素,則表達式(P)+ N(相當於N +(P))和(P)-N(其中N的值為n)表示到數組對象的第i + n個元素和第i-n個元素(如果存在)。

因此,在您的第一種情況下p的類型為char *並且(p + 1)給出的結果是一個指針,該指針以sizeof(char)遞增[ 多數情況下為1字節],因此指向第二個元素p持有的char數組p 由於實際上,由p保留的數組的類型為int [在32位系統中,假設長度為4個字節],因此,根據存儲的值,[ 1被存儲為0000 0000 0000 0001 ], *(p+1)打印出0

OTOH,在第二種情況下p的類型為int *並且(p + 1)給出的結果是指針,該指針的sizeof(int)增加sizeof(int) ,因此指向p持有的int數組的第二個元素。 由於實際上,由p保留的數組的類型為int ,因此根據存儲的值,[ int x[] = {1, 2, 3}; ], *(p+1)打印2

假設sizeof(int)是16位。 二進制2是0000000000000010。sizeof(char)是8位。 小字節序和大字節序是存儲多字節數據類型的兩種方式。

考慮以下代碼:
int i = 2; char c =(char )&i; 如果((* c)== 2)
printf(“小端”); 否則//如果* c為0 printf(“ Big endian”);

從此代碼可以得出結論,Big Endian將2存儲為0000000000000010。但是Little Endian將其存儲為0000001000000000。,所以零,因為輸出將意味着前8位為零,因此系統為Big Endian。 如果一直使用Little Endian,答案應該是2,因為char p只能指向8位。 實際上,聲明指針的數據類型意味着要指定您希望它引用的任何位以及遞增后它將跳多少位。 如果在此示例中,由於p是char指針,則*(p + 1)將在Big endian中引用00000010,在Little Endian中引用00000000。 您的編譯器可能正在使用32位整數,因此我認為在兩種情況下,*(p + 1)都將為0。(因為2 => 00000000 00000000 00000000 00000010從任一側來的第二個字節為0)

參見:`#include

       int main()
      {
        int x[] = {1, 2, 3};
         char *p = &x;
        printf("%d\n", *p);
         printf("%d\n", *(p+1));
          printf("%d\n", *(p+2));
          printf("%d\n", *(p+3));
         printf("%d\n", *(p+4));
          printf("%d\n", *(p+5));
         printf("%d\n", *(p+6));
         printf("%d\n", *(p+7));
          printf("%d\n", *(p+8));
          return 0;
            }`

輸出:1 0 0 0 2 0 0 3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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