6 回答
TA貢獻2080條經驗 獲得超4個贊
數組是一個數組,指針是指針,但在大多數情況下,數組名稱將轉換為指針。經常使用的一個術語是它們會衰減到指針。
這是一個數組:
int a[7];
a 包含七個整數的空間,你可以在其中一個中賦值賦值,如下所示:
a[3] = 9;
這是一個指針:
int *p;
p不包含任何整數空格,但它可以指向整數的空格。例如,我們可以將其設置為指向數組中的一個位置a,例如第一個:
p = &a[0];
可能令人困惑的是你也可以這樣寫:
p = a;
這并沒有數組的內容復制a到指針p(無論這將意味著)。相反,數組名稱a將轉換為指向其第一個元素的指針。因此,分配與前一個分配相同。
現在您可以p以類似的方式使用數組:
p[3] = 17;
這有效的原因是C,中的數組解除引用運算符[ ]是根據指針定義的。x[y]意思是:從指針開始x,步驟y元素在指針指向的位置之后前進,然后取出那里的任何東西。使用指針算術語法,x[y]也可以寫成*(x+y)。
為了做到這與正常的陣列,比如我們的工作a,該名稱a中a[3]必須首先被轉換為一個指針(在第一元件a)。然后我們向前邁出3個元素,并采取任何在那里。換句話說:將元素放在數組中的第3位。(這是數組中的第四個元素,因為第一個元素編號為0.)
因此,總之,C程序中的數組名稱(在大多數情況下)轉換為指針。一個例外是我們sizeof在數組上使用運算符。如果a在此上下文中轉換為指針,sizeof a則會給出指針的大小而不是實際數組的大小,這將是相當無用的,因此在這種情況下a意味著數組本身。
TA貢獻1852條經驗 獲得超1個贊
當數組用作值時,其名稱表示第一個元素的地址。
當數組未用作值時,其名稱表示整個數組。
int arr[7];
/* arr used as value */
foo(arr);
int x = *(arr + 1); /* same as arr[1] */
/* arr not used as value */
size_t bytes = sizeof arr;
void *q = &arr; /* void pointers are compatible with pointers to any object */
TA貢獻1936條經驗 獲得超7個贊
一個像這樣聲明的數組
int a[10];
分配內存10 int秒。你不能修改,a但你可以用指針算術a。
像這樣的指針只為指針分配內存p:
int *p;
它沒有分配任何ints。你可以修改它:
p = a;
并使用數組下標,你可以使用:
p[2] = 5;
a[2] = 5; // same
*(p+2) = 5; // same effect
*(a+2) = 5; // same effect
TA貢獻1797條經驗 獲得超4個贊
我認為這個例子揭示了這個問題:
#include <stdio.h>
int main()
{
int a[3] = {9, 10, 11};
int **b = &a;
printf("a == &a: %d\n", a == b);
return 0;
}
它在gcc 4.9.2中編譯好(帶有2個警告),并打印以下內容:
a == &a: 1
哎呀:-)
所以,結論是否定的,數組不是指針,它不是作為指針存儲在內存中(甚至不是只讀的指針),即使它看起來像是,因為你可以用&運算符獲取它的地址。但是 - 哎呀 - 操作員不工作:-)),不管怎樣,你都被警告過:
p.c: In function ‘main’:
pp.c:6:12: warning: initialization from incompatible pointer type
int **b = &a;
^
p.c:8:28: warning: comparison of distinct pointer types lacks a cast
printf("a == &a: %d\n", a == b);
C ++在編譯時拒絕任何此類錯誤嘗試。
編輯:
這就是我要展示的意思:
#include <stdio.h>
int main()
{
int a[3] = {9, 10, 11};
void *c = a;
void *b = &a;
void *d = &c;
printf("a == &a: %d\n", a == b);
printf("c == &c: %d\n", c == d);
return 0;
}
即使c并且a“指向”相同的內存,也可以獲取c指針的地址,但是無法獲取a指針的地址。
- 6 回答
- 0 關注
- 1229 瀏覽
添加回答
舉報
