簡體   English   中英

C取消引用數組的指針?

[英]C dereferencing a pointer to array?

我有一些看起來像這樣的代碼:

int *array[10];

printf("%p\n", array); // Prints an address
printf("%p\n", *array); // Prints a different address
printf("%d\n", **array); // Segmentation Fault 11
printf("%d\n", *array[0]); // Segmentation Fault 11
printf("%d\n", (*array)[0]); // Segmentation Fault 11

為什么會出現細分錯誤? 它不應該在第一個數組中打印第一個值嗎?

要仔細看一下,請了解聲明的性質:

int *array[10];

它聲明了一個指向int s的10個指針的數組(當前未初始化)-請注意,這與指向10個int的數組的指針不同,后者將被聲明為int (*array)[10] 即使以這種方式聲明,您仍然需要使用某種東西來初始化指針。

printf("%d\n", array); // Prints an address

這將打印ages數組的地址(將該數組傳遞給printf會自動將其轉換為指針)。

printf("%d\n", *array); // Prints a different address

這使用相同的規則將數組轉換為指針,然后取消對該指針的引用。 因此,您要打印數組的第一個值(等效於printf("%d\\n", ages[0]) )。 但是,您實際在此處打印的是地址,而不是整數(即使未初始化)。

printf("%d\n", **array); // Segmentation Fault 11
printf("%d\n", *array[0]); // Segmentation Fault 11
printf("%d\n", (*array)[0]); // Segmentation Fault 11

現在,它們每個都取消引用存儲在array[0]的未初始化指針。 它們確實確實是指向int的,但是指向該int的指針是編譯器和/或您的OS決定放置在其中的任何內容。


示例:指向數組的指針

使用指向數組的指針的示例如下所示:

#include <stdio.h>

int main()
{
    int array[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int (*parr)[10] = &array;


    printf("%p\n", parr);
    printf("%p\n", *parr);
    printf("%d\n", **parr);
    printf("%d\n", *parr[0]);
    printf("%d\n", (*parr)[0]);
}

輸出 (地址明顯不同)

0x7fff5fbff990
0x7fff5fbff990
1
1
1

最后三個都最終導致相同的元素,但是以不同的方式進行處理。

由於嘗試取消引用未初始化的指針(即Undefined Behavior) ,所以會遇到分段錯誤。

此命令(及所有以下命令):

**ages

解引用數組(它會衰減為指針),然后您將對其取消引用。 您有一個指針數組,而不是指向數組的指針。

int *array[10];

array是指向int的指針的array [10](請注意[]優先級高於* )。 但是,這10個指針均未初始化為指向有效位置。

鑒於,

    printf("%d\n", array); // address of array itself (also address of first element)
    printf("%d\n", *array); // getting the value of the fisrt array element - UB/unitilialise (currently points to some random location)
    printf("%d\n", **array); // dereference that first pointer - UB/segfault as deferencing an initialised pointer
    printf("%d\n", *array[0]); // same as *array
    printf("%d\n", (*array)[0]); // same as **array
#include <iostream>
        using namespace std;
        #include <math.h>
        #include <string.h> 

        int main() {


            int arr[5] = {1,2,3,4,5};

            int *p=arr;


            int intgerSize=sizeof(int);


            for(int k=0;k<5;k++)


            {  
                cout<<"arr ["<<k<<"] "<<*(p+(k*sizeof(int)/intgerSize));  
                cout<<"  "<<(p+(k*sizeof(int)/intgerSize));
                cout<<"  "<<p+k<<"\n"; 

            }`enter code here`

            return 0;
        }
OUTPUT:- 
arr [0] 1 0x7ffd180f5800  0x7ffd180f5800
arr [1] 2 0x7ffd180f5804  0x7ffd180f5804
arr [2] 3 0x7ffd180f5808  0x7ffd180f5808
arr [3] 4 0x7ffd180f580c  0x7ffd180f580c
arr [4] 5 0x7ffd180f5810  0x7ffd180f5810

暫無
暫無

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

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