當前位置:首頁 » 編程語言 » c語言數組的地址跟首地址的關系
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言數組的地址跟首地址的關系

發布時間: 2023-01-05 03:59:22

c語言數組首地址相關問題!!

若a是一維數組名,我們知道*a就是a[0],就是*(arr+0)。因為a是數組的首地址,*a就是取首地址所指元素,就是數組的第一個元素。
同樣的道理,a是二維數組名時,*a也是取a的第一個元素,但是此時a所指的元素是一個一維數組,所以,實際上a所指元素是一維數組的首地址。
二維數組a,a是數組地址,指向行;有一個等價關系 a[i]=*(a+i)
a[i]指向列,&a[i]又指向行。

你可以將*和&理解為相反的操作:
a指向行,*(a+i)指向列,*(*(a+i)+j)等價於a[i][j];
就按a[3][4]這個例子來看:3行4列數組a可以理解為a[0],a[1],a[2]這三個一維數組
a[0][0] a[0][1] a[0][2] a[0][3]//第一行a[0][]
a[1][0] a[1][1] a[1][2] a[1][3]//第二行a[1][]
a[2][0] a[2][1] a[2][2] a[2][3]//第三行a[2][]
(數組含有4個元素)構成的二維數組,*a就是a[0],而a[0]就是第0行的首地址,也就是第一個數組的首地址。*(a+i)就是a[i],就是第i行的首地址。

如果現在定義a是字元型數組,輸出*a(也就是第一行的首地址)為0000,再輸出*(a+1)就是0004,而不是0001,就可以說明a是指向一維數組的指針。

⑵ c語言中,字元數組的首地址字元指針的地址也是第一個字元的地址嗎為什麼不一樣

字元串常量的地址是字元串保存在內存的一組地址。字元數組的首地址代表著該字元串第一個元素的地址。
字元指針是指向字元類型的指針。字元指針並沒有地址,當定義一個字元指針變數後,這個變數便有了自己的地址,字元指針變數同時保存著某個地址,這個地址也可以指向單個字元元素,也可以指向字元串。
如:
char
a;
a=getchar();
char
*p;//變數p本身有一個地址.
p=&a;//p保存了變數a的地址,也就是說p指向了a.
同樣地,
char
a[20]="english";
char
*p=a;//p保存了字元數組的首地址,也就是說p指向了該數組的第一個元素。
求賞分~

⑶ c語言數組地址指向首元素嗎

C語言數組名,就是數組的首地址.
數組的首地址,就是首元素地址.
所以
C語言數組地址指向首元素是正確的.

int
a[N];
a的值
就是&a[0]

⑷ c語言,數組首地址的地址和首地址的內容居然是一樣的,看懂了就進來看看吧

理解這個很重要,當你理解之後你就會發現設計C語言的大師們是多麼的聰明,這些設計非常利於C語言書寫的簡潔
a與&a都是指針,指針有兩個要素
第一個是地址值,也就指向的位置,你列印出來的就是地址值,a與&a的地址值是一樣的
第二個是類型(所指向的數據類型),a指向數組第一個元素,&a指向數組a,a+1後的地址值會偏移一個元素的長度,&a+1後的地址值會便宜一整個數組的長度,所以a與&a類型是不一樣的

關於指針與數組的關系,理解之後對你寫代碼質量會有很大的幫助,當然一開始理解起來會有難度,有一句話說的好:在C語言中只有一維數組(N維數組的元素是數組),數組名作為指針時永遠指向第一個元素,如
數組a[3] ,*a = a[0],
數組a[3][4], *a = a[0],只不過這時候a[0]又是一個數組,這時候a[0]又是指向它自己元素的第一個元素,又有*a[0] = a[0][0].
這種方式可以推廣到N維數組,所有數組直接對數組名取地址(如&a)得到的指針指向該數組,而不是指向第一個元素,注意這點區別哦,理解了我上面所說的,就知道了

還有對你的疑問說說我的看法
「arr表示的是數組的首地址」:沒錯,arr就是指向第一個元素的指針
"&arr表示的是數組的首地址的地址":這句話不對,我更傾向於把&arr理解為指向數組arr的指針

「arr相當於一個指針, 我現在直接用printf輸出arr相當於輸出了arr中儲存的內容(不是輸出以該內容為地址的變數),其結果居然與arr的地址是相同的,這怎麼可能。」:

arr只是一個符號,本身不是變數不存在存儲內容的說法

⑸ C語言,數組名與數組第一個元素的關系

首先,你的老師講「一維數組名是個指針常量,它存放的是一維數組第一個元素的地址」,這個有點問題,數組名本身就代表這個數組的第一個元素的地址,不能說「它存放的是一維數組第一個元素的地址」,a有指針的語法,但它並不是指針,它就代表它本身所處的地址,a就是&a[0],這個地址內存放的是a[0],也就是你放進去的1。
至於&a,這個就有點講究了,在早期的c語言標准下,這個是不合法的,但是對一個數組取地址不合法有點說不過去啊,所以後來的c標准(具體哪一年不記得了)就允許對數組取地址,但含義不同了,&a在數值上和a以及&a[0]是相同的,但&a的類型是個int(*)[5],是個一維數組指針,相對於a提升了一級

⑹ 數組首地址,哪個表示數組首元素地址

數組首地址是數組的起始地址.
C語言中, 數組名代表的就是數組的首地址
同時 第一個元素的地址, 也是首地址.
多維數組下, 任意一維的第一個元素地址 都是首地址的表示方式.

⑺ c語言中什麼叫首地址

首地址就是該變數所佔的存儲區域中的第一個單元的地址。

比如定義一個數組,數組的第一個數的地址就是首地址

int a[10];

那麼a[0]的地址就是首地址

int a[10][10];

則 a[0][0]的地址就是首地址

⑻ C語言中,數組在內存中佔一片連續的存儲區,由什麼來代替它的首地址

C語言中規定,數組名就代表了該數組的首地址。

整個數組是以首地址開頭的一塊連續的內存單元。如有字元數組char c[10]。設數組c的首地址為2000,也就是說c[0]單元地址為2000。則數組名c就代表這個首地址。

因此在c前面不能再加地址運算符&。如寫作scanf("%s",&c);則是錯誤的。在執行函數printf("%s",c) 時,按數組名c找到首地址,然後逐個輸出數組中各個字元直到遇到字元串終止標志''為止。

(8)c語言數組的地址跟首地址的關系擴展閱讀:

數組的表示方法:

數組元素是組成數組的基本單元。數組元素也是一種變數, 其標識方法為數組名後跟一個下標。下標表示了元素在數組中的順序號。

數組元素的一般形式為:數組名[下標] 其中的下標只能為整型常量或整型表達式。如為小數時,C編譯將自動取整。

例如,a[5],a[i+j],a[i++]都是合法的數組元素。數組元素通常也稱為下標變數。必須先定義數組, 才能使用下標變數。在C語言中只能逐個地使用下標變數, 而不能一次引用整個數組。

⑼ C語言,數組名與數組第一個元素的關系

數組是多個元素的集合,而其第一個元素只是它的一個部分


當我們定義一個數組時,要用到方括弧修飾符, 如

inta[10];

這也就決定了它的類型為int [10],但其元素的類型卻為int


區別:

而C中的指針和數組實際上十分類似(但數組的指針為常量),所以當你嘗試用整型(若要用printf完整輸出應該用「%ld」格式化)的格式輸出一個數組時,一般會輸出一個-9223372036854775807 ~9223372036854775807的整數,其實質是數組的起始位置的指針。(注意,輸出的范圍根據cpu的位數而不同,以上為64位輸出的結果)

而當你用a[0]來使用第一個元素時,其類型為int


關系:

在區別中已經提到,指針和數組十分類似,也就是說可以用用於指針的一元運算符」解引用「(*)來獲得一個數組的第一個元素。

也就是說,一下兩個表達式是等效的

a[0]
*a

那麼同理,我們也可以用「取地址「運算符(&)來獲取第一個元素的地址,也就是數組的地址(注意,這里的等號不是賦值語句,只是表示左右兩個表達式等效)

a=&a[0]

⑽ c語言中起始地址和首地址有什麼區別

本質上,起始地址和首地址沒有區別,對同一個數組來說,它們是同一個地址。
其實這兩個說法沒有很明確的概念,只是按照慣例,經常會說:
數組名,是數組在內存中連續存儲單元的首地址
數組的指針,是數組的起始地址
只是按照數組方式說明和按照指針方式說明罷了,如果非要說有區別,就是數組方式訪問和指針方式訪問的區別,a[i++]的訪問不會改變a的地址,但如果 *p=a; p++會修改指針的起始地址。