6 回答

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個贊
數(shù)組是一個數(shù)組,指針是指針,但在大多數(shù)情況下,數(shù)組名稱將轉(zhuǎn)換為指針。經(jīng)常使用的一個術(shù)語是它們會衰減到指針。
這是一個數(shù)組:
int a[7];
a
包含七個整數(shù)的空間,你可以在其中一個中賦值賦值,如下所示:
a[3] = 9;
這是一個指針:
int *p;
p
不包含任何整數(shù)空格,但它可以指向整數(shù)的空格。例如,我們可以將其設(shè)置為指向數(shù)組中的一個位置a
,例如第一個:
p = &a[0];
可能令人困惑的是你也可以這樣寫:
p = a;
這并沒有數(shù)組的內(nèi)容復(fù)制a
到指針p
(無論這將意味著)。相反,數(shù)組名稱a
將轉(zhuǎn)換為指向其第一個元素的指針。因此,分配與前一個分配相同。
現(xiàn)在您可以p
以類似的方式使用數(shù)組:
p[3] = 17;
這有效的原因是C,中的數(shù)組解除引用運(yùn)算符[ ]
是根據(jù)指針定義的。x[y]
意思是:從指針開始x
,步驟y
元素在指針指向的位置之后前進(jìn),然后取出那里的任何東西。使用指針?biāo)阈g(shù)語法,x[y]
也可以寫成*(x+y)
。
為了做到這與正常的陣列,比如我們的工作a
,該名稱a
中a[3]
必須首先被轉(zhuǎn)換為一個指針(在第一元件a
)。然后我們向前邁出3個元素,并采取任何在那里。換句話說:將元素放在數(shù)組中的第3位。(這是數(shù)組中的第四個元素,因?yàn)榈谝粋€元素編號為0.)
因此,總之,C程序中的數(shù)組名稱(在大多數(shù)情況下)轉(zhuǎn)換為指針。一個例外是我們sizeof
在數(shù)組上使用運(yùn)算符。如果a
在此上下文中轉(zhuǎn)換為指針,sizeof a
則會給出指針的大小而不是實(shí)際數(shù)組的大小,這將是相當(dāng)無用的,因此在這種情況下a
意味著數(shù)組本身。

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個贊
當(dāng)數(shù)組用作值時,其名稱表示第一個元素的地址。
當(dāng)數(shù)組未用作值時,其名稱表示整個數(shù)組。
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貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個贊
一個像這樣聲明的數(shù)組
int a[10];
分配內(nèi)存10 int秒。你不能修改,a但你可以用指針?biāo)阈g(shù)a。
像這樣的指針只為指針分配內(nèi)存p:
int *p;
它沒有分配任何ints。你可以修改它:
p = a;
并使用數(shù)組下標(biāo),你可以使用:
p[2] = 5;
a[2] = 5; // same
*(p+2) = 5; // same effect
*(a+2) = 5; // same effect

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個贊
我認(rèn)為這個例子揭示了這個問題:
#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個警告),并打印以下內(nèi)容:
a == &a: 1
哎呀:-)
所以,結(jié)論是否定的,數(shù)組不是指針,它不是作為指針存儲在內(nèi)存中(甚至不是只讀的指針),即使它看起來像是,因?yàn)槟憧梢杂茫\(yùn)算符獲取它的地址。但是 - 哎呀 - 操作員不工作:-)),不管怎樣,你都被警告過:
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“指向”相同的內(nèi)存,也可以獲取c指針的地址,但是無法獲取a指針的地址。
- 6 回答
- 0 關(guān)注
- 1222 瀏覽
添加回答
舉報