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

c語言數組存放地址

發布時間: 2022-07-09 09:18:47

c語言數組的地址

其實你這個疑問是概念上的混淆,或者說對指針了解上上的欠缺

首先講int a[3] = {2,3,4};
這里的a是這個數組的首地址,比如定義如:int *p = a;這時如果你進行如下操作:
p++;
printf("%d\n",*p);
結果會是輸出2,也就是說p+1相當於數組索引加1,但是像你所問的為什麼&a和a是相同的 ,首先要知道他們分別代表什麼意思,a:像上面所說的是數組的首地址,做自加運算會根據數組類型來計算偏移量,那麼&a是什麼東西呢,實際上它也是一個指針,是指向一個具有3個元素的數組的指針,如何理解,看以下定義:

如果你定義int *q = &a;這時編譯器肯定報錯,繪制出數據類型不一致,那麼你這樣樣定義就沒有問題:int (*q)[3] = &a;這時如果你再對q進行++操作,那麼加的就不同了,如相面的p++操作後p的值會加4,而這里q++操作後的值會加12,也就是跳過3個數組元素,然而,確實這兩個指針的初始值是一樣的,只是類型不一樣而已,這對二維數組的訪問時很方便的,這個你可以參照2維數組得到進一步理解,講的有點亂,不知道你能不能理解

㈡ c語言中把數組名作為該數組的什麼即數組中第一個元素的存儲地址

c語言中把數組名作為該數組的首地址,即數組中第一個元素的存儲地址。如果有定義int a[10],*p;
則以下三個語句的作用是完全相同的:
p=a;
p=&a[0];
p=&a;

㈢ C語言中整型數組的每個元素在內存中是如何存放的

整型數組每個元素在內存中連續存儲,每個整型元素存儲方式取決於機器硬體。
一、數組元素都是連續存儲的,地址依次從低到高。
如字元數組 char a[10];
其元素有10個,為a[0]到a[9], 地址連續。 如果a的起始地址為0x1234,那麼後續地址依次為0x1235, 0x1235...0x123D。
二、每個元素具體存儲方式,取決於CPU。 有兩種:
1、小端(Little Endian):
將低序位元組存儲在起始地址(低位編址), 地址低位存儲值的低位,地址高位存儲值的高位 。
目前大多數CPU是按照這種方式存儲的,包括intel和移動端最常見的arm。
比如4位元組整型值為0x12345678的情況,那麼在內存中會存儲為:

0x78 0x56 0x34 0x12
2、大端(Big Endian):
與小端相反, 將高序位元組存儲在起始地址(高位編址),地址低位存儲值的高位,地址高位存儲值的低位。
之前的例子在大端情況下存儲為:
0x12 0x34 0x56 0x78

㈣ C語言數組存放其他數組地址

這個很簡單啊

intarr0[]={1,2};
intarr1[]={1,2};
intarr2[]={(int)arr0,(int)arr1};

printf("%d",*((int*)arr2[0])+1);//訪問數據

大概就是這樣

㈤ C語言,數組,內存存放地址

應該是a[1][3];
因為二維數組就像矩陣一樣,前一個下標表示第i行,後一個下標表示第j列。
具體如下:
a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5]
a[1][0],a[1][1],a[1][2],a[1][3],a[1][4],a[1][5]
a[2][0],a[2][1],a[2][2],a[2][3],a[2][4],a[2][5]
從第一行開始數,從左往右依次是第一個a[0][0],第二個是a[0][1]……
直到第一行數完有從第二行開始,所以第十個是a[1][3].

㈥ C語言:數組的值是地址

不對。
數組名是數組的首地址,就是數組中第一個元素的地址,是常量。常量是不能出現在賦值號=左邊作為左值的。樓上的都沒有解釋清楚,說數組名就是指針是錯誤的,指針是變數,是用來存儲變數地址值的變數,而數組名是常量。一般情況下聲明一個數組,比如char a[10];之後,數組名a都是數組的首地址,是一個地址常量。但是在函數聲明的形參列表中除外。比如:int foo(char a[10]);在這種情況下這樣的聲明與int foo(char a[]);int foo(char * a);是等價的,就是說這種情況下,就算你寫的是數組的形式,編譯器實際處理的時候也當指針來處理(注意指針是變數,形參也是變數,二者剛好對應)。所以在函數foo內部,你對a進行++, --, +=,=之類的帶賦值的操作是完全合法的,因為此時a就是一個指針,不是數組名,當你往函數foo裡面傳入一個已經事先聲明的數組的首地址時候,指針a裡面的值就是你這個已經聲明的數組的首地址,這樣你在foo裡面就可以對你那個數組進行操作,正是因為C有這個傳地址的優點,所以省略了很多不必要的拷貝工作,試想如果沒有這個傳地址,你傳一個有幾萬個元素的數組進去,那拷貝工作是相當可觀的。這樣,你該明白了int main(int argc, char ** argv);裡面為什麼可以對argv進行++操作了,既然「main函數的第二個形參是一個指向字元串的指針數組」,argv出現在函數聲明中,所以它實際上是一個指針,它並不是「一個指向字元串的指針數組」,而是一個可以獲取「一個指向字元串的指針數組」的首地址值的變數。

㈦ c語言數組、地址問題請高手解釋

定義了數組a,則機器在內存當中給數組a開辟一片內存存儲數組a,數組a的元素是順序存儲的,所以說數組a所在的地址就是數組a第一個元素所在的地址,這兩個指針(&a,&a[0])其實算是指向同一個地址的,所以列印出來的數值是相同的。

%p應該是64位32進制形式輸出,%d是十進制形式輸出的。&a[0]跟a其實是一回事,是相等的,所以第一行的第二個數,換算成十進制就跟第二行的第一個數是相等的。0x22FE30=2293296。

㈧ C語言中,數組在內存中佔一片()的存儲區,由()代表它的首地址。

數組在內存中佔一片(連續)的存儲區,由(首元素的地址)代表它的首地址
數組名是一個(指針)常量,不能對它進行賦值運算