面試經典 C語言之陣列名分析

2022-04-10 09:57:23 字數 1754 閱讀 6750

給定乙個陣列int a[10]; 下面哪些不可以表示a[1]的位址?
a. a+sizeof(int)
b. &a[0]+1
c. (int*)&a+1
d.(int*)((char*)&a+sizeof(int))
對於這個題目,我當時的分析是這樣的,對於陣列名a,它是乙個int*指標常量,指向陣列第乙個元素的位址,既然是指標常量,a+sizeof(int)即為a+4,肯定是不可以表示a[1]的,b顯然是可以的,對於c答案,就出現疑惑了,對乙個指標取位址應該是int **型別,那麼(int*)&a 應該表示指向存放a指標的區域的指標,看起來好像與a[1]毫不相干,所以c應該是不行的(實際證明是可以的),對於d答案,同樣的道理,好像是不行的,因此答案似乎是acd.

出人意料的是,答案盡然是a而已,這是為什麼?

好吧,那是因為&a和a指向的是同一地點,如果有這個結論,得到答案a就不足為奇了。我記起來當初學sizeof函式的時候,向當時教c語言的老曹頭問過了乙個問題,為什麼sizeof(a)的值不是4而是陣列的大小呢,比如說這個例子裡面就是20而不是4,那麼,關於陣列名,到底有哪些特性呢?

陣列名是乙個指標常量,指向陣列的第乙個元素,但是當陣列作為引數傳入函式時,陣列名的這一特性消失,可以做自增自減等操作。

例如,對於下面這段**:

#include
int main()
;
a++;
}
提示只有左值(lvalue)才能自增。而對於以函式名作為引數輸入時,這一常量特性消失,如下面**執行就沒有問題:

#include
void func(int a[5]);
int main()
;
func(a);
}
void func(int a[5])

#include
void func(int a[5]);
int main()
;
printf("the value of a is %x\n",a );
printf("the value of &a is %x\n", &a);
printf("the value of a+1 is %x\n",a+1 );
printf("the value of &a+1 is %x\n",&a+1 );
int *p1=(int *)(a+4);
printf("%d\n",p1[-1] );
printf("%d\n",((int *)(a+4))[-1] );
int *p2=(int *)(&a+1);
printf("%d\n",p2[-1] );
//printf("%s\n",((int *)(&a))[1] ); //加上這句話會出錯
相應的輸出如下:

可以看出a和&a數值上是一樣的,&a+1相較於a多了20個位元組的距離,這正好是乙個陣列的長度。

sizeof(a)不是指標所佔空間的大小,而是指數組a所佔空間的大小。

C語言之陣列

c語言之陣列 一,一維陣列 1,一維陣列的定義 型別符 陣列名 常量表示式 注 1 常量表示式中可以包括常量和符號常量.int a 3 5 是合法的,int a n 是不合法的,c語言不允許對陣列的大小作動態定義 2 如果在被呼叫的函式 不包括主函式 中定義陣列,起長度可以是變數或非常量表示式,可稱...

C語言之陣列

c語言陣列 一 陣列的概念 用來儲存一組資料的構造資料型別 特點 只能存放一種型別的資料,如全部是int型或者全部是char型,陣列裡的資料成為元素。二 陣列的定義 格式 型別 陣列名 元素個數 舉例 儲存5個人的年齡 int agrs 5 在記憶體中開闢4x5 20個位元組的儲存空間 可以在定義陣...

C語言之陣列

一 一維陣列 1.1 一維陣列的定義 1.一維陣列是指數組中的每個元素只帶有乙個下標的陣列。定義方式為 型別說明符 陣列名 常量表示式 1.2 一維陣列元素的引用 1.陣列元素的引用形式為 陣列名 下標表示式 2.乙個陣列元素實質上市乙個變數名,代表記憶體中的乙個儲存單元,乙個陣列佔據的是一連串連續...