簡體   English   中英

我們可以在C語言中使用非指針作為指針嗎

[英]Can we use a non-pointer as a pointer in C

我對C還是很陌生,但我想知道,我們可以使用像unsigned int這樣的東西(如void指針)嗎? 我寫了這個簡短的示例來說明我想做什么,但是我似乎無法使其正常工作,因此我想知道是否有可能:

int main () {

    int i;

    char char_array[5] = {'a', 'b', 'c', 'd', 'e'};
    int int_array[5] = {1, 2, 3, 4, 5};

    unsigned int unsigned_int;

    unsigned_int = (unsigned int) int_array;

    for(i=0; i < 5; i++) {
    printf("[unsigned_int] points to %p, which contains the int %d\n", unsigned_int, *((int *) unsigned_int));
    unsigned_int = unsigned_int + sizeof(int);

    }

    unsigned_int = (unsigned int) char_array;

    for(i=0; i<5 ; i++) {
            printf("[unsigned_int] points to %p, which contains the char '%c'\n", unsigned_int, *((char *) unsigned_int));
            unsigned_int = unsigned_int + sizeof(char);
    }

}

上面的代碼是我想要的工作,但是下一個示例是我希望它的工作方式:

int main () {

int i;

int int_array[5] = {1, 2, 3, 4, 5};
char char_array[5] = {'a', 'b', 'c', 'd', 'e'};

void *void_pointer;

void_pointer = (void *) int_array;

for(i=0; i < 5; i++) {
printf("[integer pointer] has an adress of %p, and contains %d\n", void_pointer, *((int *)void_pointer));
void_pointer = (void *) ((int *)void_pointer + 1);
}

void_pointer = (void *)char_array;
for(i=0; i<5; i++) {
printf("[char pointer] has an adress of %p and contans %c\n", void_pointer, *((char *)void_pointer));
void_pointer = (void *) ((char *)void_pointer + 1);
}

}

我了解我想做的可能與眾不同,但我真的很想知道我是否可以這樣做。 當我嘗試編譯第一個文件時,出現錯誤消息:

pointer_type5.c: In function ‘main’:
pointer_type5.c:12:24: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
         unsigned_int = (unsigned int) int_array;
                    ^
pointer_type5.c:15:92: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
         printf("[unsigned_int] points to %p, which contains the int %d\n", unsigned_int, *((int *) unsigned_int));
                                                                                        ^
 pointer_type5.c:20:24: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
         unsigned_int = (unsigned int) char_array;
                    ^
pointer_type5.c:23:103: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
                 printf("[unsigned_int] points to %p, which contains the char '%c'\n", unsigned_int, *((char *) unsigned_int));

當我運行第二個我得到這個:

[integer pointer] has an adress of 0x7fffcba7a5f0, and contains 1
[integer pointer] has an adress of 0x7fffcba7a5f4, and contains 2
[integer pointer] has an adress of 0x7fffcba7a5f8, and contains 3
[integer pointer] has an adress of 0x7fffcba7a5fc, and contains 4
[integer pointer] has an adress of 0x7fffcba7a600, and contains 5
[char pointer] has an adress of 0x7fffcba7a5e0 and contans a
[char pointer] has an adress of 0x7fffcba7a5e1 and contans b
[char pointer] has an adress of 0x7fffcba7a5e2 and contans c
[char pointer] has an adress of 0x7fffcba7a5e3 and contans d
[char pointer] has an adress of 0x7fffcba7a5e4 and contans e

考慮到您的答復后,我將原始代碼更改為:

int main () {

    int i;

    char char_array[5] = {'a', 'b', 'c', 'd', 'e'};
    int int_array[5] = {1, 2, 3, 4, 5};
    unsigned int *unsigned_int;

    unsigned_int = (unsigned int *) int_array;

    for(i=0; i<5; i++) {
            printf("[unsigned_int] points to %p, which contains the int %d\n", unsigned_int, *((int *) unsigned_int));
            unsigned_int = (unsigned int *) ((int *) unsigned_int + 1);
    }

    unsigned_int = (unsigned int *) char_array;

    for(i=0; i<5 ; i++) {
            printf("[unsigned_int] points to %p, which contains the char '%c'\n", unsigned_int, *((char *) unsigned_int));
           unsigned_int = (unsigned int *)((char *) unsigned_int + sizeof(char));
    }

}

它不完全是我要嘗試執行的操作,但是我想我想執行的操作無法完成,因此此代碼提供了相同的輸出。 編輯代碼使我想到了下一個小問題。 我們為什么可以使用:

  unsigned_int = (unsigned int *)((char *) unsigned_int + sizeof(char));

當我們嘗試使用int時,它一次跳轉了太多字節,並為我們提供了隨機數。 為了解決這個問題,我將其更改為:

 unsigned_int = (unsigned int *) ((int *) unsigned_int + 1);

但是為什么它不能與sizeof(int)一起使用?

一般來說,沒有。 不能保證任何指針都可以用unsigned int表示。 從指針到整數的轉換是實現定義的,可能沒有意義。 實際上,它通常是有意義的,但是您需要一個具有足夠多的值位的整數類型來表示所有指針。 uintptr_t (來自stdint.h )(如果已定義)就是這種類型。

暫無
暫無

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

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