⑴ 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找到首地址,然後逐個輸出數組中各個字元直到遇到字元串終止標志'