『壹』 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語言二維數組地址問題
1、&a[0][0]為0行0列元素的首地址,a[0]+n為0行第n個元素地址,那麼a[0]是表示0行首元素地址嗎?
>>正確, a[0]就是0行首地址.
&a[0]是零行的首地址,實際上行的地址也只有一個,也無所謂0行的首地址吧?
>>&a[0]值上, 是和a[0]相同的, 不過類型不一樣. a[0]等效於int *型,實際上是指向一個元素. 而&a[0]是行指針, 指向一行.所以,a[0]+n和&a[0]+n是完全不同的.
+n相當於元素位移了n個位置嗎,所以代表第n個元素地址嗎?
>>+n取決於原始指針的類型. 如果是a[0]+n 移動的是n個元素.而&a[0]+n就是移動n行了.
然後*(a[n]+m)就表示n行第m個元素了?
>>這句沒錯. 任何情況下, *(p+n)都等效於p[n]
2、書中寫a+n表示第n行的首地址,那是相當於&a[n]嗎,a不是表示數組首個元素地址嗎,怎麼+n不是元素位置改變,卻是位移了行?
>>這個上面說過了, 核心在於指針的類型. 二維數組int a[M][N]的數組名a, 本質上是常量的int (*)[N]類型, 也就是數組指針. 移動的時候是整行移動的.
還是a+n表示n行首個元素的地址?為什麼
>>同上
*(a+n)與a[n]是等價的,原理是什麼,*(*(a+n)+m)怎麼也能表示n行m列元素呢?
>>*(a+n)與a[n]等價, 這個是C語言的一個規則. 其本質是, 當編譯器遇到a[n]這樣的形式時, 實際上是翻譯成*(a+n)進行編譯的. 這種可以用一個很少見的形式來驗證.你定義
int a[4]={1,2,3,4}; 然後輸出
printf("%d ", 3[a]);
對, 就是把數組名放進[], 實際上會輸出a[3]
『叄』 c語言數組首地址的一個疑問
你可以把數組名看成一個指針啊,只不過數組名不需要再像指針變數那樣用一個內存單元存儲其地址。
比如:
int n;
int *p=&n;
這里p就需要另外的空間存儲。
而數組名的值就是其地址值,所以a和&a相等;
a[0]的值和a的值放在一個內存單元中,這句話是錯誤的。a[0]的值是第一個數組元素的值,a的值是數組首地址。而a的值不需要用另外的空間存儲。
不知道這樣說你懂了沒?
數組是復合型數據結構,sizeof操作的結果是數組元素占內存的總的位元組數。
a不是一個常量,也不是一個變數,只是一個數組標識符。
『肆』 C語言數組的地址跟首地址的關系
以下是本人的理解,希望對您有幫助!
1. a是數組的首地址,&a是a[0]的首地址和&a[0]等效
2. 對於int (*p)[4]的理解:首先p是一個指針(隔*近!);是一個什麼樣的指針呢?是一個指向int型數組的指針。故:p是一個數組指針!
『伍』 求助!!C語言 二維數組的指針及首地址問題
若arr是一維數組名,我們知道*arr就是arr[0],就是*(arr+0)。因為arr是數組的首地址,*arr就是取首地址所指元素,就是數組的第一個元素。
同樣的道理,arr是二維數組名時,*arr也是取arr的第一個元素,但是此時arr所指的元素是一個一維數組,所以,實際上arr所指元素是一維數組的首地址。
就按arr[3][4]這個例子來看:3行4列數組arr可以理解為arr[0],arr[1],arr[2]這三個一維數組(數組含有4個元素)構成的二維數組,*arr就是arr[0],而arr[0]就是第0行的首地址,也就是第一個數組的首地址。*(arr+i)就是arr[i],就是第i行的首地址。
如果現在定義arr是字元型數組,輸出*arr(也就是第一行的首地址)為0000,再輸出*(arr+1)就是0004,而不是0001,就可以說明arr是指向一維數組的指針。
希望對你又幫助。
『陸』 字元數組循環右移2位。c語言
你是要移動到別一個緩存區里,還是空出左邊數組位置來
『柒』 為什麼c語言的指針➕1是向後移動2位,不是移動4位,一個指針不是4byte嗎那應該移動4位才對呀
注意指針的移動不是指的加上指針的大小,另外你的說法也有問題,指針的大小與平台是有關的,與CPU的定址能力也是有關的,如如果編譯32位程序那麼指針大小是4位元組=32位,如果編譯64位程序那麼指針大小為64位,因為現在一般編譯器所編譯的默認為32位程序,所以就有了指針大小一般為4位元組的說法,實際指針大小應以編譯器中sizeof為准
如
int *p;
printf("%d",sizeof(p));
然後說到你的問題,指針的移動是指針指向元素的移動,比如指針指向一個整形數組
int a[5];
int *p=a;//p指向數組的首地址即第一個元素
p=p+1;//這時p指向數組的第二個元素,也就是說現在p保存的是數組第二個元素的地址
從這里看出,p的移動是從指向第一個元素移動到指向第二個元素,這里定義int型占兩個位元組,所以p從指向第一個元素轉為指向第二個元素p要越過第一個數組元素所佔用的內存空間2個位元組,同理,如果數組是char型,p移動一個那麼地址變動為1個位元組
『捌』 c語言中什麼叫首地址
首地址就是該變數所佔的存儲區域中的第一個單元的地址。
比如定義一個數組,數組的第一個數的地址就是首地址
int a[10];
那麼a[0]的地址就是首地址
int a[10][10];
則 a[0][0]的地址就是首地址
『玖』 C語言 數組首地址
a為數組名,代表數組首地址
&a 中的&為取地址運算符
結果都是一樣