嗨,我是 C 新手,正在嘗試了解指標和陣列之間的細微差別。具體來說,我不明白從根本上區分以下兩個物件:
int *obj1[N];
int *obj2;
obj2 = malloc(N*sizeof(int))
這兩個物件本質上都為我提供了一個指標陣列,但我會以不同的方式參考它們來檢索它們指向的值:
val1 = *obj1[i];
val2 = obj2[i];
我認為它們最終都是“指標陣列”(盡管我理解對 obj2 使用“陣列”這個詞在技術上并不正確),但是 obj2 似乎隱含地認識到我想要這個值而不需要取消參考有 * 而 obj1 沒有。有人可以為我澄清這兩個物件之間的結構差異導致上述參考它們的值的差異嗎?
uj5u.com熱心網友回復:
本宣告
int *obj1[N];
確實宣告了一個指標型別的物件陣列int *
。
本宣告
int *obj2;
宣告該型別的物件,int *
并在下一條陳述句中
obj2 = malloc(N*sizeof(int));
為型別為 的 N 個元素的陣列分配了記憶體int
。
所以在這行
val1 = *obj1[i];
val2 = obj2[i];
為了清楚起見,最好重寫為
int val1 = *obj1[i];
int val2 = obj2[i];
你得到型別的物件int
。在第一行,運算式obj1[i]
產生一個型別的物件,int *
因為obj1
它是一個指標陣列。因此,要獲取型別的指向物件,int
您需要取消參考指標運算式obj1[i]
。在第二行中,運算式obj2[i]
產生了一個型別的物件,int
因為分配了一個整數陣列。
如果要分配型別的指標陣列,則int *
必須撰寫
int **obj2 = malloc(N*sizeof(int *));
在這種情況下,要訪問兩個陣列的元素,您可以撰寫
int val1 = *obj1[i];
int val2 = *obj2[i];
請注意,在此運算式obj1[i]
中,陣列指示符obj1
被隱式轉換為指向int **
其第一個元素的型別的指標。所以這兩個運算式obj1[i]
和obj2[i]
被等效評估。兩個運算式*obj1[i]
and*obj2[i]
也等價于obj1[i][0]
and obj2[i][0]
。
另一方面,您也可以撰寫例如
int **obj3 = obj1; // the array is implicitly converted to pointer
//...
int val3 = *obj3[i];
請記住,根據 C 標準(6.5.2.1 陣列下標)
2 后綴運算式后跟方括號 [] 中的運算式是陣列物件元素的下標名稱。下標運算子[]的定義是E1[E2]等同于(*((E1) (E2)))。由于適用于二元 運算子的轉換規則,如果 E1 是陣列物件(等效地,指向陣列物件的初始元素的指標)并且 E2 是整數,則 E1[E2] 指定第 E2 個元素E1(從零開始計數)
uj5u.com熱心網友回復:
第一個是一個指向 的int*
指標陣列int
,據說是本地分配的(在堆疊上)。它們還沒有指向任何有效資料。
第二個是動態分配的陣列int
(在堆上)。它還不包含任何有效值。
這兩個物件本質上都為我提供了一個指標陣列
不,見上文。
但我會以不同的方式參考它們
是的,您必須這樣做,因為它們是用于不同目的的不同資料型別。
我認為它們都是最終效果的“指標陣列”
再次,這是錯誤的。
要動態分配類似于 的指標陣列int *obj1[N];
,您必須這樣做:
int** ptrptr = malloc(n * sizeof *ptr);
uj5u.com熱心網友回復:
可以像使用一維陣列一樣使用指向 int (int *pointer) 的指標。
指標陣列 (int *array[N]) 的使用類似于二維陣列。
括號取消參考指標。指標[1] 或陣列[2][1]
#include <stdio.h>
#include <stdlib.h>
#define N 5
int main ( void) {
int *array[N] = { NULL};
int *pointer = NULL;
if ( NULL == ( pointer = malloc ( sizeof pointer * N))) {
fprintf ( stderr, "malloc problem\n");
exit ( 1);
}
for ( int each = 0; each < N; each) {
pointer[each] = each;
}
for ( int row = 0; row < N; row) {
if ( NULL == ( array[row] = malloc ( sizeof *array * N))) {
fprintf ( stderr, "malloc array problem\n");
exit ( 1);
}
for ( int col = 0; col < N; col) {
array[row][col] = ( row * N) col;
}
}
printf ( "pointer:\n");
printf ( "element:->0->1->2->3->4\n ");
for ( int each = 0; each < N; each) {
printf ( " -", pointer[each]);
}
printf ( "\n\narray elements [row][col]:");
printf ( "\ncol:------->0->1->2->3->4");
for ( int row = 0; row < N; row) {
printf ( "\nrow:%d --> ", row);
for ( int col = 0; col < N; col) {
printf ( " -", array[row][col]);
}
}
printf ( "\n");
int value = array[3][0];
int number = *array[3];
printf ( "number: %d value: %d\n", number, value);
free ( pointer);
for ( int row = 0; row < N; row) {
free ( array[row]);
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/488052.html
上一篇:bmp檔案轉換成二維二進制陣列