C語言書上說,陣列名是指標常量,可是我每次執行程式後位址都會改變啊

2022-03-12 19:56:19 字數 5723 閱讀 7384

1樓:匿名使用者

視窗關閉就意味著程式的結束,所以陣列名指標就會到了最開始的位置。

2樓:

常量在一次執行時不變,誰告訴你,兩次執行也不變,何況%p你不用,非用%x誰告訴你這是正確用法,這是未定義的!在windows裡用vc的話,由於每個程序都有自己的位址空間,都從0x00400000開始執行,載入後資料的位址應該一樣的,雖然實體地址不同但值應該相同的!至於其他系統由於排程方式不同,位址不同很正常的,也沒規定非要相同,這不是標準,何必大驚小怪!

3樓:

一樓,這個是字元陣列不是字串。所以,就是3.

為什麼不是常量,因為在windows引導程式進入記憶體的時候本來就不在同乙個地方。。。載入及執行的時候都用的位址偏移量、但是你printf出來的還是實體地址。這就導致了不是同乙個位址量。

4樓:

指標常量是指在每次執行時指向的位址不能改變,但不是每次執行都指向同一位址,每次執行時系統的記憶體情況都不同,要根據記憶體使用進行分配,所以每次執行時的位址幾乎都不同。

但每次執行時指標的指向是始終不變的。

5樓:匿名使用者

每次程式都是被分配同的空間

在每次執行是陣列位址不變

6樓:匿名使用者

你那個陣列應該寫name[4],而不應該是3,因為還要放個結束標記 '\0' 呢!

c語言一維陣列和指標的關係時老師講「一維陣列名是個指標常量,它存放的是一維陣列第乙個元素的位址」

7樓:軒逸一

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

這句話的意思是輸出a[0]的位址。

printf ("%#x\n",a);

這句話的意思也是輸出a[0]的位址。這裡的a並不是表示乙個常量,它表示的是乙個指向a陣列的乙個指標,並且是指向陣列開始的a[0],c裡面把陣列當做指標來操作。

而在宣告的時候就已經給陣列a分配了固定的記憶體空間,它的每個元素的位址是固定不變的。

至於你的賦值操作對記憶體位址是沒有影響的,它只是把這個值儲存到那個位址裡的記憶體空間。

就像,你定了房間,你的門牌號是不變的,不管你放什麼東西到房間裡,門牌號都不會改變

8樓:莊政警

首先,你的老師講「一維陣列名是個指標常量,它存放的是一維陣列第乙個元素的位址」,這個有點問題,陣列名本身就代表這個陣列的第乙個元素的位址,不能說「它存放的是一維陣列第乙個元素的位址」,a有指標的語法,但它並不是指標,它就代表它本身所處的位址,a就是&a[0],這個位址內存放的是a[0],也就是你放進去的1。

至於&a,這個就有點講究了,在早期的c語言標準下,這個是不合法的,但是對乙個陣列取位址不合法有點說不過去啊,所以後來的c標準(具體哪一年不記得了)就允許對陣列取位址,但含義不同了,&a在數值上和a以及&a[0]是相同的,但&a的型別是個int(*)[5],是個一維陣列指標,相對於a提公升了一級

c語言中的陣列名字是指標常量還是常量指標呢

9樓:藍天下的

陣列名是指標

來常量,指源針不是有常量指標和指標常量和常量常指標嗎?位址是絕對的,score指向受保護,但首位址的內容可以改變,所以陣列首位址應該是指標常量int *const score,你的第二個註釋說位址就是指標,應該是指標常量,指標就是位址是一種寬泛的說法,不對請指正哈

10樓:夜下的雨天

score是乙個常量指標,是int const *const int *p是底層const 表示可以修改指標的位址,但不能修改指標所指向的對像版的值,int const *p

是頂層權const 表示不可以修改指標的位址,但可以修改指標所指向的對像的值。

為什麼c語言中,陣列名是乙個位址常量,不能對它進行賦值運算

11樓:匿名使用者

在最終的來彙編結果中,陣列名只是源乙個標號,對

bai應一du個位址,在程式中使用數zhi組就是要dao替換成這個起始位址,因此作為標號本身是不可以修改的,也不是乙個變數。

用陣列名進行計算就是用陣列起始位址計算,但不可以給陣列名重新賦值

c語言中陣列名代表陣列首位址,它的值在執行期間可以改變嗎?

12樓:文化廚子

1、陣列的首位址,在同一計算機上,正常執行的情況下,這個位址是不會變的。

2、陣列的首位址,在不同的計算機,不同的系統上,一般情況下這個位址會變的。

3、現代作業系統的記憶體管理使用的是虛擬記憶體技術,一般來說,習慣性的講記憶體看作是乙個大的位元組陣列,每乙個位元組都有乙個記憶體位址,本身虛擬記憶體位址的變化在同一臺計算機上基本不大,但是實際的物理記憶體位址,變化肯定是很大的。問題中所說的陣列的首位址,本質上是虛擬記憶體位址,因此才有1和2中的描述。

13樓:匿名使用者

比如:a[5]

其中a就代表代表首位址了

但是a++就是說他的下乙個位址了

絕對不是說讓首位址發生變化了.

二維陣列名是不是乙個「指標」?

14樓:匿名使用者

理解一復:陣列名就是位址制常量,

位址常量就是不能更改的位址,一旦定義了乙個陣列就定了

指標是變數,這是和陣列本質的區別,他可以令他隨意等於任何乙個有效的位址

理解二:個人認為陣列名不佔空間,就是個標誌,名字,和人名一樣, 人名不佔空間,

a=5;a作為左值,實際就是乙個位址,在c語言中,廣義的說,任何名字(包括函式 名)都是位址,但他們本身不佔空間,他們恰恰是空間的名字,他們裡面的具體內容佔用才是佔用空間的,就和你家房子可以說多大面積的,我能說你家位址佔多大面積嗎

一句話:陣列名是位址,指標是存放位址的容器,所以你可以把陣列名扔到指標裡

總結:只有能放東西的容器才佔空間,不能放東西名字都是浮雲

15樓:匿名使用者

1,無論是一636f707962616964757a686964616f31333264646463維,二維或n維陣列,陣列名就是乙個指標常量,它代表陣列元素在記憶體中的首位址。

2,二維陣列名不佔儲存空間的,如1,陣列名只是乙個指標常量,打個比方,你的名字指向你這個人,但是你的名字就是人嗎?顯然不是。陣列名也是這個意思。

對於你的提問中:

在程式裡,所有陣列都必須是先定義好再使用,也即是說在編譯之前,每個訪問陣列的地方都已經確定了,或者說每個需要出現陣列名的地方都已經出現了陣列名了

這句話是有問題的,只有靜態陣列的儲存空間和區域是確定的,而動態陣列的儲存空間和區域是不確定的,只是在使用陣列前必須定義它的型別,到底是char or int 等等。

對於標籤一說,還不如就把陣列名當做指標常量來理解呢。你記住,陣列名就代表了乙個元素首位址。就是乙個指標常量。

你也可以自己程式設計驗證嘛,乙個很簡單的程式:

#include

void main()

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

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

}程式第一行輸出的就是陣列a的首位址

第二行輸出的是a[0]的位址

但是兩個值是一樣的。

說明陣列名就是代表陣列的首位址,這是確確實實存在的。希望能幫助你。

16樓:匿名使用者

二維陣列名是乙個指標,但是說它是常量的意思是它本身不可更改:如內你定義int a[34][3],a確實是個

容指標,*a指向陣列中第乙個整數;但是你不能通過a++操作使在此操作後a指向陣列中第二個整數,而普通指標(int a[12];int *b=a;b 就是普通指標)可以這麼操作的,所以說它是「指標常量」;

如果你站在編譯器的層次看待陣列名,指標名確實是不佔據記憶體的,不信你可以寫程式測試一下,乙個陣列名american 和 a 經過編譯後生成的exe程式乙個位元組都不相差。這是因為編譯器把它替換成了特殊的標誌,但是本質上講是這樣的:你int a[2]定義乙個陣列,編譯器會分配給你兩個int的空間,編譯器會把你在任何時刻對這兩個位元組的訪問 編譯成你對相應記憶體單元的訪問。

17樓:小飛花兒的憂傷

陣列名只是一段連續空間的名字,跟指標完全不一樣。

它不能被改變,誰會去給乙個名字加1。

它在值傳遞時傳的是首元素位址,所以很多人把它當做指標。

18樓:匿名使用者

地位等同的……但是不完全相同

19樓:匿名使用者

你發重了

c語言中指標和引用的區別

20樓:匿名使用者

指標,全稱為指標變數,是用來儲存記憶體位址的一種變數。程式中,一般通過指標來訪問其指向的記憶體位址中的內容(資料)。

引用,是c++中提出來的一種新的使用變數的方式,即,給實際變數起個別名,通過這個別名來引用實際的變數。標準c中不支援變數的引用。

這兩個概念沒有任何相關性。

指標是實實在在的變數,有自己的記憶體儲存空間,它可以指向任何有效的變數。

引用是一種形式、方法,定義的引用變數,實際上是原實際變數的另乙個名稱(別名),引用變數本身沒有自己的實際儲存空間,操作引用變數,就是在操作實際變數。如:

21樓:匿名使用者

我建議你還是去看看 c++primer 這本書,專門有一小節是講指標和引用的區別的。

大師的書才是真理,別在這裡被誤導了~~~~

22樓:軍軍

引用是c++中才加入的概念。

在c語言中陣列名是乙個什麼的常量

23樓:匿名使用者

陣列名是代表該陣列的首位址且符合識別符號書寫規定的變數識別符號。

整個陣列是以首位址開頭的一塊連續的記憶體單元。如有字元陣列char c[10],設陣列c的首位址為2000,也就是說c[0]單元位址為2000。則陣列名c就代表這個首位址。

因此,在使用scanf()函式的時候,變數c前是不能新增位址運算子&的,scanf("%s",&c);則是錯誤的的寫法。

24樓:聽不清啊

在c語言中陣列名就是乙個指向同名陣列首位址的乙個(該陣列元素型別的)指標常量。

例如:int a[100];

那麼,a就是乙個指向a[0]的int 型的指標常量。

25樓:匿名使用者

int [10] 型別

理解成:int陣列型別,陣列大小為10。

你可以使用這個檢視:

#include

using namespace std;

int main()

{int ar[10];

cout<或者你在編譯器裡面單步除錯到int ar[10],然後在變數檢視視窗裡面可以看到該變數ar的型別。

26樓:

int a[10]; //a的型別為const int *,是常值整型指標,不能改變a的值。

27樓:匿名使用者

陣列名代表該陣列的起始位址,沒別的意思,你可以用vc++除錯,可以看到陣列名,就是乙個位址

28樓:1234567珏

陣列名 代表首位址,,,這樣看來可以當做int 但貌似可以自定義。。

c中,陣列名跟指標有區別嗎,C語言中陣列名和指標的區別

其實可以認為陣列名就是乙個不可更改的常量指標。但是 嚴格來說,二者有一定區別,比如sizeof a a為陣列名的時候,算出來是a這個陣列所佔位元組數,但是如果a是指標,不管指向什麼,結果都是乙個int的位元組數 取決於特定機器 因而,有人認為陣列名是乙個可以退化為常量指標的型別,這種退化在陣列名作為...

關於c語言二維陣列陣列名與指標的問題

先說些這個2維陣列 int arr 3 4 可以理解為乙個3行四列的矩陣,那麼第一維arr 0 arr 1 arr 2 中存的分別是對應行的位址,也就是說arr 0 存的是乙個 大小為4的整形陣列位址 這樣的話就好理解了,arr存的位址值其實與arr 0 本質上是相同的。都是這個連續空間的開始位址。...

c中陣列名到底是不是位址,c中陣列名到底是不是乙個位址?

a 1表示字串中第1個字元 從0計數 開始,它代表乙個位址沒錯,但是c 中字串對 的過載功能,表示從當前位址直到字串結束到輸出到標準輸出,即列印埠,所以當char a asdf 時,cout a 1就會列印sdf char陣列比較特殊,你用int陣列來看看 字串會連續輸出,直到遇見 0 int陣列就...