我有以下c代碼:
int arr[8] = {1, 2, 3, 4, 5, 6, 7, 8};
int **pp = &arr;
編譯器抱怨,我不知道為什么。arr 不是指向 int 陣列的指標嗎?我應該能夠將它的地址分配給一個 int **。還有其他方法嗎?
uj5u.com熱心網友回復:
arr 不是指向 int 陣列的指標嗎?
不,arr根本不是指標。arr是一個陣列。如果你取 的地址arr,你得到的是一個指向陣列的指標,而不是指向指標的指標。這會起作用:
int arr[8] = {1, 2, 3, 4, 5, 6, 7, 8};
int (*pp)[8] = &arr;
// cleaner by using a type alias:
using Arr8 = int[8];
Arr8* pp = &arr;
如果你想要一個指向指標的指標,那么你必須首先創建一個你可以指向的指標:
int* p = arr; // same as = &arr[0]
int** pp = &p;
uj5u.com熱心網友回復:
如果你有一個物件宣告為
T x;
其中 T 是某個型別說明符,那么指向這樣一個物件的宣告將看起來像
T *p = &x;
現在考慮陣列
int arr[8] = {1, 2, 3, 4, 5, 6, 7, 8};
使用這種型別的定義
typedef int T[8]:
你可以像這樣重寫陣列宣告
T arr = {1, 2, 3, 4, 5, 6, 7, 8};
所以指向物件的指標宣告arr看起來像
T *p = &arr;
由于型別說明符 T 表示型別int[8],因此指向此型別物件的指標將具有 type int ( * )[8]。
所以上面的宣告看起來像
int ( *p )[8] = &arr;
至于宣告
int **pp;
那么可以通過以下方式引入
int *p = arr;
int **pp = &p;
那是在第一個宣告中
int *p = arr;
陣列指示符arr被隱式轉換為指向其第一個元素的指標。所以指標p由陣列的第一個元素的地址初始化arr。
反過來,指標pp由指標的地址初始化p。
uj5u.com熱心網友回復:
這可能是陣列“arr[8]”包含存盤在可執行映像(確切地說是“.data”部分)中的值的原因。因此,由于優化,指標包含一個固定值。而且該變數是虛擬的(就像宏一樣)并且沒有真正的來源。這可以通過對“arr[8]”變數執行操作來解決,例如增加它的指標或使其成為全域變數或創建一個參考“arr[8]”的變數
之后嘗試指向“指向 arr[8]”和“arr[8]”的指標,它可能會被修復。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/427869.html
上一篇:如果`stdio.h`中已經定義了`printf.o`,為什么還需要鏈接呢?
下一篇:C位明智而不是運算子更改值型別?
