c中,陣列名跟指標有區別嗎?

時間 2021-05-07 23:11:17

1樓:西門吹牛

#include

#include

char *test1();

char *test2();

int main()

char *test1()

// warning: address of stack memory associated with local variable 'p' returned [-Wreturn-stack-address]

char *test2()

執行結果如下

hello world

結論字元指標test1中,是乙個指向常亮字串位址的指標

字元陣列,記憶體申請在堆上,返回直接返回,會報警告,返回了乙個堆上的位址,函式執行結束會被釋放

字元指標是乙個左值,可以進行賦值

字元數名是乙個右值,表示乙個陣列,不允許被賦值

#include

#include

int main()

; printf(" %d \n", *a);

printf(" %d \n", *(a + 1));

printf(" %p \n", &a[0]);

printf(" %p \n", &a);

printf(" %d \n", sizeof(aerror: 'int *' with an expression of type 'int (*)[3]'

// int *p1 = &a;

int (*p)[3] = &a;

return 0;

}執行結果如下:

1 2

0x7ffee54be5bc

0x7ffee54be5bc

結論:陣列名稱 a 指向陣列的首元素位址(一般情況下)

陣列名稱 a 可以像指標一樣操作

&a 是指標陣列的指標,型別為 int (*p)[3],這種情況下 a 不能被看成是首元素的位址

sizeof(a) 的情況下 a 不能被看成是首元素的位址

int *p1 = &a 會直接報錯, 'int *' with an expression of type 'int (*)[3]'

所以陣列名稱只有在被看為是陣列首元素位址的時候,可以像操作指標一樣操作。

2樓:程庚

剛看到一篇文章就來搜這個問題了

intmain

()一二個很熟悉:第乙個會輸出陣列的首位址0x7ffc006fb3bc,第二個由於c的指標運算規則,加1,是按照資料型別來加,這裡是int,所以位址會加4,輸出0x7ffc006fb3c0

第三個呢?如果陣列名就是指標,那麼&x,就是指標的位址,我們怎麼知道他是多少呢,但是如果他確實是指標的指標,那麼至少x!=&x,因為這樣就代表乙個位於0x7ffc006fb3bc的指標指向的也是0x7ffc006fb3bc,類似這種場景:

實際輸出如下:

和第乙個相同,所以說,陣列名不是指標,只是在某些情況下會衰變為指標,比如你可以用*(x+1)來引用陣列的第二個元素

另外說一下第四個,&x=x,那&x的型別是什麼?

如果我們用乙個int指標儲存&x,即 :

int *b=&x

會提示,指標型別不相容

實際上,&x是乙個指向這樣乙個int陣列的指標,這個陣列有3個元素

所以應該是:

int (*b)[3]=&x

那麼 &x +1 等於多少呢?上面說過指標運算會根據指向元素的型別進行scale,這裡指向的物件是」有三個元素的int陣列「,所以是加12

3樓:暮無井見鈴

陣列名只是大多數時候隱式轉換成指向首元素的指標型別右值罷了。只是這個情況過於頻繁(包括在 return 中用陣列名),導致有人產生了陣列名實質是指標的錯覺。

這些時候不會轉換:

對其用 &

對其用 sizeof

C++中還包括取引用

然後char p= 和 char *p= 右邊的字串字面量在使用上是有區別的。

前者宣告乙個陣列,字串字面量用於初始化陣列。陣列生存期和作用域與宣告方式相關。而且假如陣列沒有 const 資格符,字串內容是可以修改的。

這個陣列首位址不能在函式中返回,除非宣告用了 static 。

後者宣告乙個指標。字串字面量本身成為乙個靜態儲存期的陣列,它再隱式轉換成指標以初始化宣告的指標。這個字串是不可修改的(修改會導致未定義行為,陣列本身可放在唯讀記憶體區)。

它的首位址可以在函式中返回。

最後推薦使用 C++ 的 std::array 。它不會一言不合就變成指標,你要顯式地寫 a.data() 才能提供 C 的陣列到指標轉換。

4樓:payall4u

區域性變數不好說明區別(因為區別實在太大),假設全域性變數char p = "one";

char *x = "123";

符號表中:

x -> 一塊記憶體a

p -> "one"的首位址

(這裡,一塊記憶體a裡面的值是"123"的首位址)char c = p[1];

會產生movb p+1, %eax

而char c = *(x + 1);

會產生mov x, %eax

movb 1(%eax), %eax

5樓:冒泡

誰告訴你陣列名就是指標了呢,陣列和指標是兩種不同的型別,建議別隨便用「實質」這個詞,除非把C標準啃透了並實現過C的編譯器

6樓:張半仙

C Primer Plus 11章中 11.1 三、陣列與指標

四、陣列與指標的差別

我才發現這個問題的標籤裡有…………哈哈哈哈哈哈哈哈哈哈哈哈。

7樓:WangXuan

比如對於 int a[4];

1、sizeof(a);

2、&a;

在這兩種情況下,a是單獨的型別,即「長度為4的int陣列」型別,而不是「指向int的指標」型別。求sizeof(a)得到的是陣列的尺寸16。求&a得到的不是「指向指標的指標」型別,而是「指向長度為4的陣列的指標」型別,即int (*)[4] 型別,此處4不能省略,因為「指向不確定長度陣列的指標」是沒有意義的,編譯器若不知道該指標指向的型別,就無法編譯指標的加減法運算(指標指向型別的長度未知,加減法的位移量就未知)

你可以用乙個指標來接受&a的結果:

int (*p)[4] = &a;

p用起來有點像二維陣列,比如:p[0][2]其實就是a[2],而p[1][2]則超出了陣列a的範圍。

但也不完全一樣,因為二維陣列是陣列的陣列,p是陣列的指標以上,除了sizeof(a)和&a以外,其它情況下a都可以看做指向首位址的指標

8樓:

我從來不去想這種所謂的「實質」問題,因為這一「實質」只是人為定義的乙個概念。

萬事都從記憶體分析就好,記憶體才是真正的「實質」。

任何資料都有乙個位址,它是指標還是變數名,取決於對它的解析方式(寫在組合語言裡,你不需要管)。至於它本身究竟是什麼的問題,壓根就沒有什麼所謂的「實質」。

不然編譯器還搞什麼型別檢查?浪費時間不是?

多用智慧型指標和動態陣列,別想這些有的沒的。

9樓:羅小公尺

這裡面的答案都說的不錯。

10樓:圓月亮

「在c中,陣列名實質不就是個指標嗎」?

學了一點皮毛,就覺得自己看透本質了?以為洞悉天機了?

指標可以 pointer++ ,陣列名可以麼?

指標可以賦值再指向別人,陣列名可以麼?

還有,對兩者取位址、對兩者取 sizeof() 都是不一樣的。

「甲乙丙實質不就是個丁戊己」這種話,還是等真正精通之後再說吧。

c語言中對陣列名取位址會發生什麼?

陣列名本質是指標.我個人不建議這樣理解,我也可以說指標本質是整型數,整型數本質是010101.intarr 10 cout arr name endl int 10 長度為10的存有int的陣列 cout arr name endl int 10 指向 長度為10的存有int的陣列 的指標 cout...

c語言中為什麼一維陣列名可以賦值給乙個普通的指標,二維陣列名卻不可以賦值給乙個指向指標的指標?

yihonge 可以,不過有編譯 警告罷了。警告是在提示你可能存在潛在問題,而不是不能這樣做,你完全可以強制轉換。編譯器行為罷了,就像char s hello 其實字串常量應該是const char 但是C編譯器偏偏沒有警告,C 編譯器就會有警告,因為C 的型別檢查比C嚴格。至於為什麼有警告 拋個問...

c語言指標二維陣列a中,a和a 0 的值不應該是一樣的嗎?為什麼會出現以下問題?

給你把各個型別的關係理清就懂了。首先說a,假設a是乙個5個元素的int陣列,那麼a的型別是int 5 是陣列型別,其元素為int,有5個元素長。然後關於a 1這個表示式,由於陣列型別本身是不可變的,也不可 1,但是c語言規定了一條規則,那就是陣列型別可以隱式轉換成其首元素的指標,結果型別是int i...