亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

數組名稱是指針嗎?

數組名稱是指針嗎?

牧羊人nacy 2019-05-21 15:54:25
數組名稱是指針嗎?數組的名稱是C中的指針嗎?如果沒有,數組的名稱和指針變量之間有什么區別?
查看完整描述

6 回答

?
犯罪嫌疑人X

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,該名稱aa[3]必須首先被轉換為一個指針(在第一元件a)。然后我們向前邁出3個元素,并采取任何在那里。換句話說:將元素放在數組中的第3位。(這是數組中的第四個元素,因為第一個元素編號為0.)

因此,總之,C程序中的數組名稱(在大多數情況下)轉換為指針。一個例外是我們sizeof在數組上使用運算符。如果a在此上下文中轉換為指針,sizeof a則會給出指針的大小而不是實際數組的大小,這將是相當無用的,因此在這種情況下a意味著數組本身。


查看完整回答
反對 回復 2019-05-21
?
小怪獸愛吃肉

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 */


查看完整回答
反對 回復 2019-05-21
?
LEATH

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


查看完整回答
反對 回復 2019-05-21
?
繁星coding

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指針的地址。


查看完整回答
反對 回復 2019-05-21
  • 6 回答
  • 0 關注
  • 1229 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號