簡體   English   中英

指向數組的指針與普通指針

[英]Pointer to array Vs normal pointers

我對數組指針,普通指針以及如何訪問感到困惑。 我已經嘗試過了...

int *ptr1, i;
int (*ptr2)[3];
int myArray[3] = {1, 1, 1};
int myArray1[5] = {1, 1, 1, 1, 1};
ptr1 = myArray;
ptr2 = myArray1;// compiles fine even though myArray1 contains 5 elements 
                 // and ptr2 is pointing to array of 3 elements.

printf("%d",ptr2[3]); // prints some garbage.

為什么此語句打印垃圾? 什么是正確的陳述? 誰能解釋?

我們還可以將指向數組的指針聲明為

int (*ptr)[]; // ptr is a pointer to array.

當你做

ptr2 = myArray1;

編譯器將向您拋出警告消息。 Look boss types are not compatible. 在某些情況下,數組會衰減為指針。 警告消息是因為,當數組衰減為指針時,衰減的類型為指針。 在這種情況下

ptr1 = myArray; 

myArray衰減為int *

但是當你這樣做

ptr2 = myArray1;

myArray1衰減為int *指針,但ptr2的類型為int (*)[]

為了避免警告,您應該說

ptr2 = &myArray1; //&myArray1 returns address of array and type is int(*)[].

為什么此語句打印垃圾? 什么是正確的陳述? 誰能解釋?

printf("%d",ptr2[3]);// prints some garbage. 

是的,但是為什么? 首先讓我們看正確的語句...(請注意,索引應小於3)

printf("myArray1[%d] = %d\n", i, (*ptr2)[2]); 

我們必須使用(*ptr2)[i]打印數組元素。 這是因為,僅需提及ptr2 ,我們就可以獲取數組的地址(而不是某些int的地址)。 通過取消引用(*ptr2)我們將獲得數組0th element的地址。

指針ptr2是指向大小為3的int數組的指針

ptr2 = myArray1;  // you may getting warning for this 

應該:

ptr2 = &myArray1; // use & operator 

printf("%d", ptr2[3]);

應該:

printf("%d", (*ptr2)[2]); // index can't be 3 for three size array 
 //          ^^^^^^^  

注意,由於[]運算符的優先級比* dereference運算符的優先級高,因此需要在*ptr2周圍*ptr2括號(而如果您使用指向int的指針,則不需要上面的代碼中的括號)。

直接使用指向數組的指針和數組的地址讀取不一致我已經解釋了兩個數組都可以訪問數組元素。 (1)使用指向int的指針(2)指向數組的指針

ptr1 = myArray; 只是發現,您可以使用ptr1[i]來訪問數組元素(不是i值應該為0到4)

int (*ptr2)[3];

這表示(*ptr2)是標識符,其中包含整數數組開頭在內存中的位置。 或者,改寫說, ptr2是一個地址。 該地址包含一個值。 該值本身就是一個整數數組開頭的地址。

因此,當您編寫ptr2 = myArray1您基本上是在說“我的地址持有者的地址是myArray1開頭的myArray1 ”。

因此,當您使用ptr2[3]打印值時,實際上是在打印myArray1內存地址myArray1 ,增量為3*sizeof(ptr2)單位。 這就是為什么它看起來像垃圾,它是一些內存地址。

在打印語句中應該是(*ptr2)[3] ,這意味着“獲取ptr2的地址並獲取存儲在該地址的值。接下來,使用該第二個地址,將其遞增3*sizeof(int)並獲取值存儲在該遞增地址中。”

C語言中的數組不過是分配的內存的連續區域。 這就是為什么說:

int *x = malloc(3*sizeof(int));

是相同的:

int x[3];

由於[]*都取消了對指針的引用,因此,如果我們要訪問任一數組的第二個元素,我們可以編寫:

int value = x[1];

要么

int value = *x+sizeof(int); // Since *x would be index 0

其中的兩個主要區別是[]標記更易於閱讀,但長度必須在編譯時確定。 而使用*x / malloc()表示法,我們可以動態創建一個數組或任意長度。

暫無
暫無

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

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