C語言學習之陣列名和指標的關係區別

2021-09-28 17:47:47 字數 1450 閱讀 8294

陣列名是乙個常量,不能賦值,包括自增自減( arr++ ,arr–, ++arr, --arr)

一級指標可以接收一維陣列的陣列名,然後一級指標可以被賦值。如 int *p=arr; 時,p++ p-- ++p --p還有p=…都是允許的。

二級指標不可以直接接收二維陣列名,但可以用陣列指標來接收(乙個指標,指向的是陣列)接收,如下:

int arr[4]

[5]=

;int

**p = arr;

//錯誤,後面解釋

int(

*p1)[5

]= arr;

//正確, 使用方法: *(*(p1+i)+j) 等價於 arr[i][j]

在訪問陣列時,可以用陣列名加減的方式(只要不改變陣列名的值就行,因為它是常量,不允許被賦值),如:arr[i][j] 等價於 *(*(arr+i)+j)

int **p = arr錯誤的原因在於,p是乙個二級指標,當我想訪問乙個值時*(*(p+i)+j), 首先看*(p+i),這代表選中二維陣列的某一行,然後 加上 j就代表選中i行,j列(i,j可以為0),再整體加上乙個* 值就被取出來了。但是在 int **p = arr時,p會把整個arr陣列當成乙個整體,也就是說, p+1指向arr陣列的結尾的下個位址。而我們期望的是p+1指向下標為1的行。所以,int **p =arr,如果取值(*(p+i)+j),ij不同時為0(同時為0是可以讀出正確結果的,只有p進行加法時,+1的跨度就會是整個陣列導致出錯)。同理,如果宣告陣列指標int (*p1)[5] = arr; 就可以,因為這個指標p1的含義是p1是乙個指標,它指向了乙個長度為5個int整型數的陣列,即它指向陣列,它加1的話,會指向下乙個陣列(當然,小心使用,如果下邊沒有了陣列,它同樣會去訪問,即使後邊的空間已經不是陣列了),它知道自身如果+1的話該指向**(p1每加1,實際上arr的位址會增加sizeof(int)*5, 即指向了下一行)

記憶體:

宣告的區域性變數、形參都在棧裡,當宣告乙個char *str; 然後再 *str = 『c』,這樣寫是不正確的。首先,char *str會在棧開闢乙個4位元組(32位系統)空間,用來儲存乙個指向char型別的位址值,但是由於沒有初始化,裡面的值是無用的,如果直接 *str,相當於訪問了乙個未知的位址,並將裡面的值改為了』c』.

如果宣告乙個區域性變數 char str[20]; char *str2 = 「hello」; 給陣列名直接賦值是不正確的:str=str2。因為當宣告陣列時,是在棧中開闢20個char大小的記憶體,然後將首位址作為常量給str,也就是說,str代表的是棧的某個位址,我們可以給str所指向的空間及其後邊的空間(共20b)賦值,但是如果想改變str的值,相當於是位址 = 位址是不合法的,相反,如果我們開始宣告的就不是陣列而是char指標char *str,就可以,並且應該是必須給它賦上值初始化它,此時就不是位址=位址了,而是變數=位址,即將乙個值賦給乙個變數。

C 之 陣列名和指標

在很多情況下,可以相同的方式使用陣列名和位址 區別之一是 可以修改指標的值 而陣列名是常量不可修改 另乙個區別 對陣列應該 sizeof 運算子得到的是陣列的長度 對指標應用 sizeof 得到的是指標的長度 特點 陣列名被解釋為其第乙個元素的位址 而陣列名應用位址運算子時,得到的是整個陣列的位址 ...

C 中陣列名和指標的關係

指標是c c 語言的特色,而陣列名與指標有太多的相似,甚至很多時候,陣列名可以作為指標使用。於是乎,很多程式設計者就被搞糊塗了。而許多的大學老師,他們在c語言的教學過程中也錯誤得給學生講解 陣列名就是指標 很幸運,我的大學老師就是其中之一。時至今日,我日復一日地進行著c c 專案的開發,而身邊還一直...

陣列名與指標的關係

陣列名與指標間的聯絡 陣列名與指標間的區別分析總結 在剛剛接觸到陣列與指標時,我想最常苦惱的問題就是陣列名與指標之間有什麼關係了吧。但是他們兩者之間真的有什麼數不清道不明的關係嗎?答案無疑是否定的,接下來就讓我們來一 竟吧!首先我們需要了解一下陣列與指標的定義 陣列名與指標間的聯絡 從定義中分析,不...