[英]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.