1樓:軒逸一
printf("%#x\n",&a[0]);
這句話的意思是輸出a[0]的地址。
printf ("%#x\n",a);
這句話的意思也是輸出a[0]的地址。這裡的a並不是表示一個常量,它表示的是一個指向a陣列的一個指標,並且是指向陣列開始的a[0],c裡面把陣列當做指標來操作。
而在宣告的時候就已經給陣列a分配了固定的記憶體空間,它的每個元素的地址是固定不變的。
至於你的賦值操作對記憶體地址是沒有影響的,它只是把這個值儲存到那個地址裡的記憶體空間。
就像,你定了房間,你的門牌號是不變的,不管你放什麼東西到房間裡,門牌號都不會改變
2樓:莊政警
首先,你的老師講「一維陣列名是個指標常量,它存放的是一維陣列第一個元素的地址」,這個有點問題,陣列名本身就代表這個陣列的第一個元素的地址,不能說「它存放的是一維陣列第一個元素的地址」,a有指標的語法,但它並不是指標,它就代表它本身所處的地址,a就是&a[0],這個地址記憶體放的是a[0],也就是你放進去的1。
至於&a,這個就有點講究了,在早期的c語言標準下,這個是不合法的,但是對一個陣列取地址不合法有點說不過去啊,所以後來的c標準(具體哪一年不記得了)就允許對陣列取地址,但含義不同了,&a在數值上和a以及&a[0]是相同的,但&a的型別是個int(*)[5],是個一維陣列指標,相對於a提升了一級
c語言下標和指標的關係
3樓:千鋒教育
指標與陣列是c語言中很重要的兩個概念,它們之間有著密切的關係,利用這種關係,可以增強處理陣列的靈活性,加快執行速度,本文著重討論指標與陣列之間的聯絡及在程式設計中的應用。
1.指標與陣列的關係
當一個指標變數被初始化成陣列名時,就說該指標變數指向了陣列。如:
char str[20], *ptr;
ptr=str;
ptr被置為陣列str的第一個元素的地址,因為陣列名就是該陣列的首地址,也是陣列第一個元素的地址。此時可以認為指標ptr就是陣列str(反之不成立),這樣原來對陣列的處理都可以用指標來實現。如對陣列元素的訪問,既可以用下標變數訪問,也可以用指標訪問。
2.指向陣列元素的指標
若有如下定義:
int a[10], *pa;
pa=a;
則p=&a[0]是將陣列第1個元素的地址賦給了指標變數p。
實際上,c語言中陣列名就是陣列的首地址,所以第一個元素的地址可以用兩種方法獲得:p=&a[0]或p=a。
這兩種方法在形式上相像,其區別在於:pa是指標變數,a是陣列名。值得注意的是:
pa是一個可以變化的指標變數,而a是一個常數。因為陣列一經被說明,陣列的地址也就是固定的,因此a是不能變化的,不允許使用a++、++a或語句a+=10,而pa++、++pa、pa+=10則是正確的。由此可見,此時指標與陣列融為一體。
3.指標與一維陣列
理解指標與一維陣列的關係,首先要了解在編譯系統中,一維陣列的儲存組織形式和對陣列元素的訪問方法。
一維陣列是一個線形表,它被存放在一片連續的記憶體單元中。c語言對陣列的訪問是通過陣列名(陣列的起始地址)加上相對於起始地址的相對量(由下標變數給出),得到要訪問的陣列元素的單元地址,然後再對計算出的單元地址的內容進行訪問。通常把資料型別所佔單元的位元組個數稱為擴大因子。
實際上編譯系統將陣列元素的形式a[i]轉換成*(a+i),然後才進行運算。對於一般陣列元素的形式:《陣列名》[《下標表示式》],編譯程式將其轉換成:
*(《陣列名》+《下標表示式》),其中下標表示式為:下標表示式*擴大因子。整個式子計算結果是一個記憶體地址,最後的結果為:
*《地址》=《地址所對應單元的地址的內容》。由此可見,c語言對陣列的處理,實際上是轉換成指標地址的運算。
陣列與指標暗中結合在一起。因此,任何能由下標完成的操作,都可以用指標來實現,一個不帶下標的陣列名就是一個指向該陣列的指標。
4.指標與多維陣列
用指標變數可以指向一維陣列,也可以指向多維陣列。但在概念上和使用上,多維陣列的指標比一維陣列的指標要複雜一些。
例如,在一個三維陣列中,引用元素c[i][j][k]的地址計算最終將換成:*(*(*(c+i)+j)+k)。瞭解了多維陣列的儲存形式和訪問多維陣列元素的內部轉換公式後,再看當一個指標變數指向多維陣列及其元素的情況。
1 指向陣列元素的指標變數
若有如下說明:
int a[3][4];
int *p;
p=a;
p是指向整型變數的指標;p=a使p指向整型二維陣列a的首地址。
*(*(p+1)+2)表示取a[1][2]的內容;*p表示取a[0][1]的內容,因為p是指向整型變數的指標;p++表示p的內容加1,即p中存放的地址增加一個整型量的位元組數2,從而使p指向下一個整型量a[0][1]。
2 指向由j個整陣列成的一維陣列的指標變數
當指標變數p不是指向整型變數,而是指向一個包含j個元素的一維陣列。如果p=a[0],則p++不是指向a[0][1],而是指向a[1]。這時p的增值以一維陣列的長度為單位。
5.指標與字元陣列
c語言中許多字串操作都是由指向字元陣列的指標及指標的運算來實現的。因為對於字串來說,一般都是嚴格的順序存取方式,使用指標可以打破這種存取方式,更為靈活地處理字串。
另外由於字串以′\0′作為結束符,而′\0′的ascii碼是0,它正好是c語言的邏輯假值,所以可以直接用它作為判斷字串結束的條件,而不需要用字串的長度來判斷。c語言中類似的字串處理函式都是用指標來完成,使程式執行速度更快、效率更高,而且更易於理解。
4樓:匿名使用者
首先,p是指標變數,存放陣列a首地址。
p是變數當然就能運算,不過指標變數只能進行加減運算。
再次,p是指向int型別的指標,所以對p加減1,就是p指向的地址加減一個int型別的長度,32位系統裡int長度為4個位元組。
所以*(p 1)就等於a[1]。
望採納!
5樓:匿名使用者
int *p;
int a[5] = ;
p = a;//這裡的意思是不是把a[0]地址賦給p?
//這是對的
那這樣的結果也就是a[i] = p[i] ,可為毛會等價於*(p + i)呢?
*(p+i) 當 i=1時 p 加的可不是1 而是4是int 的大小 分配的地址肯定是連續的
6樓:匿名使用者
和你這個問題一樣
l->elem = (int *)malloc(list_size * sizeof(int));
printf("%d ", *(l->elem + i)); // 做指標運算
printf("%d ", l->elem[i]); // 只要記憶體地址是連續的不是陣列也可以使用下標來取值。
上面兩個得到的結果是一樣的
所以我認為
1. c語言的陣列應該是語法糖,只是malloc簡單的連續地址指標而已。
2. 下標運算也是語法糖,其實現原理應該是指標運算。 (所以下標可以使用在陣列中,也可以使用在指標中)
3. 由於陣列和下標是基於指標的語法糖實現,導致c語言的陣列根本沒能力去檢查陣列的邊界。 ( 上面這些都是我個人的猜測啊。)
7樓:咎千亦
型別識別符號 * 變數名eg:char * pointer性質陣列名是一個常量,不能進行自增等運算. eg: data++; x
指標是一個變數,能進行自增等運算. eg: pointer++; √引用陣列利用下標引用陣列中的資料eg: a = data[5];
指標利用取值運算子引用所指向的資料 eg: a = *pointer;其它
聯絡:當我們將一個指標指向一個陣列後,指標後陣列就有許多相同的地方了.如果在程式中使用了 pointer = data;(將指標指向陣列).此時對陣列的引用就可以使用指標變數了.具體如下:pointer[i]表示*(pointer+i),即通過帶下標的指標引用陣列元素
pointer+i,data+i;
表示data[i]的地址,指向陣列第i個元素
*(pointer+i) ,*(data+i)
表示pointer+i和data+i所指向的內容,即data[i]
c語言中陣列名和指標的區別
8樓:匿名使用者
陣列在當作引數傳遞時,可以當作指標;當然,引數傳遞相當於賦值操作,所以用指標來接受陣列的值也是可以的。
除此之外,指標就是指標,陣列就是陣列,一點也不一樣,例如1,陣列名不能作為左值,即不能被賦值,也不能進行++ --操作2,sizeof 陣列名 和 sizeof 指標 不同
9樓:
陣列名本質上就是個指標,也就是地址,但是它是一個常指標,是個固定值,而指標是是指標變數的簡稱,是個變數,這個變數存放的是地址值,它的值是可以改變的。例如:
int *p;
int a,b;
p=&a; //把變數a的地址賦值給指標p,那麼指標p就指向了變數a的記憶體單元
p=&b; //把變數b的地址賦值給指標p,那麼指標p就指向了變數b的記憶體單元
int a[10]; //整型陣列,陣列名a本質上是一個地址,是首元素地址,它是一個固定值,不能對它進行賦值操作。
c語言,陣列名與陣列第一個元素的關係
10樓:匿名使用者
主要有bai如下區別:
1、數du組zhi名代表
陣列的首地址,若daoc="abcdef",則陣列名c代表陣列元素內'a'的地址。
2、%s用於輸出一容個字串,對應的引數是陣列名(即陣列的首地址)。輸出從陣列起始位置到陣列中第一個'\0'之間的全部字元。
2、%c用於輸出一個字元,即字元的值。而陣列名是陣列的首地址,即&c[0],程式執行時,為陣列分配的儲存單元是隨機的,即每次執行&c[0]的值是不同的,故把它作為ascii值對應到相應的字元也是隨機的。若想輸出陣列第一個元素的值,可以用c[0],即printf("%c",c[0]);
11樓:匿名使用者
陣列是多個元素的集合,而其第一個元
素只是它的一個部分
當我們定義一個陣列時,內要用到方括號修飾容符, 如int a[10];
這也就決定了它的型別為int [10],但其元素的型別卻為int區別:而c中的指標和陣列實際上十分類似(但陣列的指標為常量),所以當你嘗試用整型(若要用printf完整輸出應該用「%ld」格式化)的格式輸出一個陣列時,一般會輸出一個-9223372036854775807 ~ 9223372036854775807的整數,其實質是陣列的起始位置的指標。(注意,輸出的範圍根據cpu的位數而不同,以上為64位輸出的結果)
而當你用a[0]來使用第一個元素時,其型別為int關係:在區別中已經提到,指標和陣列十分類似,也就是說可以用用於指標的一元運算子」解引用「(*)來獲得一個陣列的第一個元素。
也就是說,一下兩個表示式是等效的
a[0]
*a那麼同理,我們也可以用「取地址「運算子(&)來獲取第一個元素的地址,也就是陣列的地址(注意,這裡的等號不是賦值語句,只是表示左右兩個表示式等效)
a = &a[0]
二維陣列名和指標的關係,C語言中陣列名和指標的區別
二維陣列名即陣列地址,指向首行地址,表面上看,行地址即一維陣列指標,而陣列名指向行就應該是指標的指標,但是必須注意指標也是有型別的,型別不同資料寬度也不同。如果a 10 10 假設int p a 那麼要對行遞增執行p 時,編譯器如何知道列寬?因為int 是指指向一個 int 型別的指標,32位系統中...
c語言問題,陣列與指標,C語言陣列和指標的問題
char a computer a指向一個常量字串,常量字串是不能修改的,而你的for迴圈內要修改a指向的這個常量字串,自然要出錯 char a computer 這個a就是個普通陣列了,它的內容是可以改動的,就不會出錯了 因為 a是個指標啊 所以應該賦值賦地址!所以 應該 char a compu...
C語言 簡述一下「陣列和指標的關係」
我就是很煩 陣列是一類同型別變數的集合,類似於屬於上的集合的概念,數字也是有集合的,比如整數集,實數集等。陣列也是一個集合,陣列的名字是集合的名字,陣列後面的方括號裡的數字,表示這個集合的大小,陣列名前面的型別說明符,表示這個陣列是什麼型別的集合,比如 int a 5 a是陣列的名字,因為我們後面要...