C語言 簡述一下“陣列和指標的關係”

2021-08-19 16:30:22 字數 5906 閱讀 4496

1樓:我就是很煩

陣列是一類同型別變數的集合,類似於屬於上的集合的概念,數字也是有集合的,比如整數集,實數集等。

陣列也是一個集合,陣列的名字是集合的名字,陣列後面的方括號裡的數字,表示這個集合的大小,陣列名前面的型別說明符,表示這個陣列是什麼型別的集合,比如:

int a[5], a是陣列的名字,因為我們後面要用到陣列,所以我們必須要取一個名字,要不然程式也不知道,你呼叫的陣列是哪個不是?[5]方括號裡的數字5,表示這個陣列的大小是五個數的集合,陣列名最前面的int是型別說明符,說明陣列這個集合裡的數是什麼型別的,在c語言裡,基本型別就那麼幾個,我們除了用基本型別外,還可以使用我們自己設定的結構體等型別,相當於數學裡面,集合的說明,用來說明這個集合什麼實數集合,還是整數集合的類似意義。

指標,我們直接可以用地址來代替指標這個名字,指標就是地址,你把任何變數看成一個人,每個人肯定都有自己住的地方,變數也一樣,變數在記憶體上,一定也有地址,而指標就是地址。c語言裡可以有兩種呼叫變數的形式,一種直接使用變數的名字來呼叫,比如 int a=10;

意思就是把10這個數給變數a,除了這樣用以為,還能通過指標來使用,指標是地址,需要用到取地址符&,比如 int *c, a; c=&a;像上面的語句,c是一個指標,怎麼識別c是指標呢?因為c在宣告的時候使用了指標宣告符*,用來說明c是一個指標,而a則是一個變數,因為沒有使用指標宣告符進行宣告,c=&a,這個語句即把a的地址,給了c,因為c是指標,所以c需要的是變數的地址,而不是變數的名字,這個時候在賦值號=的後面使用了取地址符&,用來取出變數a的地址給c,當我們要用a的時候,我們可以通過指標c來訪問變數a,通過c上的地址,來找到a所在的位置,再取出a的值,這裡需要使用解地址符 *,假設有個變數d需要變數a一樣的值,我們需要使用d=(*c);這語句表示通過c的地址,訪問a,取出a的值賦值給變數d,這裡也有一個*符號,但是這個符號不是指標宣告符了,而是解地址符了,那麼怎麼判斷兩種用途的*符號的作用呢?很簡單,指標宣告符值在變數宣告,或者指標宣告的時候使用,其他地址都不是指標宣告符號,而是解地址符,怎麼判斷一個語句是宣告還是其他語句呢?

很簡單,不管是什麼宣告,前面都需要型別說明符,比如 int a,*c。這是一個宣告,宣告一個變數a,型別是int型,一個指標c,存放地址,存放的是一個int型變數的地址。對,你沒看錯,指標也需要型別說明符,因為c語言裡,有好多型別,他們大小不一樣,需要說明,然後使用他們的過程,編譯器會幫你解決的,你不用關心實現的問題。

好,上面大致說明了,陣列是什麼,指標是什麼?那麼陣列和指標的關係是什麼呢?乍一看,貌似沒有任何關係,對吧,但是還是有的,因為陣列也是放在記憶體上的啊,顯然陣列也是有地址的,即有指標的對吧,所以我們應該可以使用陣列的指標對吧,int a[5]這是一個陣列對吧,那麼它的指標要怎麼設定呢?

答案是這樣的, int *c,這是什麼意思呢?很簡單,c前面有指標說明符吧,說明c是一個指標,那麼c這個指標是面向什麼變數呢?是面向int ,那麼int 是什麼?

是陣列的特徵,的前面有個int,說明c這個指標應該是指向一個int型的陣列的對吧,所以這是一個指向陣列的指標對吧,但是問題來了,陣列是一個集合啊,比如上面說的int a[5],

這個陣列是由五個int型的陣列成的集合,你這個指標是指向哪一個數啊?如果你指向一個數,而指向一個整體,我怎麼用?我們最常用的需求是,能訪問陣列裡的每一個數啊對吧。

這裡有了需求,我們就有一個約定俗成的規定,那就是什麼規定呢?陣列的名字給它一個另外的功能,什麼功能呢?就是陣列的名字本身就是一個指標,那麼要確定是哪個數的呢?

我們預設是陣列最開頭的指標,即a[5]中的陣列名字a是一個指標,代表a[0]的地址,這是一個預設,因為我們有需求,為了能快速簡便的通過指標來使用陣列裡的數,而不是使用陣列整個地址,因為沒有意義,通過這個設定之後,我們有了進一步的需求,那麼我們a[1]的元素怎麼辦?我們也想通過指標來使用啊,很簡單,直接使用++或+即可,a+1,陣列名a代表a[0]的地址,那麼我們a+1就用來表示a[1]的地址,一點都不過分,雖然看起來有點變扭,但是符合我們的需求,而且簡便快速,同理也可以使用++,--的用法,但是地址的* ,/就沒有意義了,所以指標的 *, /是不能使用的,瞭解了約定俗成的這個規定後,百分99的程式都可以看懂了,希望能理解我說的,如果不理解,多看幾遍我說的吧,然後對照著使用陣列和指標的程式理解一下,用多了,看多了,自然就懂了。

c語言中:陣列指標與指標陣列有什麼區別?

2樓:匿名使用者

陣列指標是指向這個陣列首地址的指標,指向物件是這個陣列;

指標陣列是存放一類指標的陣列,這個陣列的每個元素都是一個指標;

例子:int a[10];

int* s;

s = a;//這裡s就是一個陣列指標,它的值就是陣列a 的首地址;當然,如果a是一個整數,那s就是一個指向整型的指標;

int a;

int* s[5];

for(int i=0;i<5;i++)s[i]=a;

//這裡s就是一個指標陣列,它的每個元素都是整型變數a的地址應該算比較明白了吧

謝樓上提醒

3樓:天雲一號

int (*p)[4]; // 定義一個陣列指標,指向含4個元素的一維陣列,陣列元素是int型別。

int *p[4]; // 定義一個指標陣列,陣列中每個元素是一個指標,指標指向**就要根據程式來定了。

判斷陣列指標與指標陣列主要通過運算子的優先順序來判斷。

int (*p)[4]; // 由於( )的優先順序高,說明p是一個指標,指向一個一維陣列的指標

int *p[4]; // 由於[ ]的優先順序高,先與p結合成為一個陣列,再由int*說明這是一個整型指標陣列

4樓:匿名使用者

1.大概說一下這三種

int * a;            這叫整型指標   這玩意兒不能指向陣列,搞清楚指向的是陣列首元素

int (* b);       這叫整型陣列指標     意思是指向陣列的指標

int * c[5]=null;          這叫整型指標陣列     意思是儲存指標的陣列

下來舉個例子,理解一下:

2.定義一個陣列,下面舉例解釋

int i[5]=;        //定義整型陣列,五元素皆為0

int n[5][5]=;            //定義二維陣列

3.三種分別舉例

(a的例子)

a=i;         //這裡i是陣列名,i相當於&i[0]。陣列名相當於是陣列i的首地址。此時* a指向陣列i首元素。

a++;然後輸出就是i[1]的值

(b的例子)

b=n;        //二維陣列名相當於n[5]這個陣列,注意這塊兒,這塊兒最難搞清楚。n代表的不是第一行第一個元素的地址,而是代表第一行元素的所有地址的陣列。這塊的指標陣列b相當於存放了n陣列第一行的所有元素的地址。

//這塊的陣列指標b和上面的指標a比較,a指向的是陣列的首元素,而b指向的是整個陣列(或者說是存放了整個一維陣列的多個元素(二維陣列由一維陣列構成,二維陣列的第一行即是一個一位陣列))

然後我們輸出(* b)[2]相當於輸出了n[0][2]

如果b++然後輸出(* b)[2]相當於輸出了n[1][2]

c的玩法:

太簡單了,不想說了。就是存放多個指標的陣列,自己想想。

5樓:匿名使用者

摟主先要明確每個詞的後面一個名詞代表其所要定義的型別陣列指標就是指向一個陣列首地址的指標(aa);

舉例:char a="hello world";

char *aa;

aa=a;

指標陣列就是一個陣列,這個陣列的元素是指標;

舉例:char a='t';

char *aa[2];

a[0]=a;

a[1]=a;

附:感覺樓上的這段舉例有點問題

int a[10];

int* s;

s = &a;

c語言下標和指標的關係

6樓:千鋒教育

指標與陣列是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語言中類似的字串處理函式都是用指標來完成,使程式執行速度更快、效率更高,而且更易於理解。

c語言陣列與指標問題,c語言陣列與指標的問題關係請教

1,書上說的不準確,陣列應該看做一種獨立的型別,sizeof只與型別有關。詳細的可以參考這個 http 如果你弄明白了這個剩下就簡單了。2,我先說一下結論吧。按照你的要求應該這樣定義p int p 3 因為你想要的是訪問每一行的數字,所以需要p為整型指標的陣列,這樣每個元素是整型指標,可以像p 1 ...

請教指標與陣列的問題,C語言的問題,指標陣列

是可以的。c在這裡是很靈活的。int a 10 相當於int const a int malloc sizeof int 10 陣列名a相當於一個常量指標,指向int型別。同樣也可以把指標當成變數型的陣列名,如你文中所說。無論是常量型的a i 還是變數型的pbuf i 編譯之後其實都是執行的 a i...

c 陣列名和指標,C 的指標與陣列名有什麼區別?

1.str是陣列,str相當 copy於陣列首地址。bai2.mstr 指向 str,相當於du指向了陣列的第一個zhi地址,dao mstr 就輸出h。3.str只是相當於陣列首地址,但是對陣列名取地址,str 得到的是一個指向整個地址的指標,型別是char 12 所以第一行輸出hello wor...