1. 程式人生 > >數組和指針

數組和指針

include 實現 for 內存 pri 而不是 www 聲明 ima

這篇主要說數組和指針,之所以要把它們兩放一塊說,是因為講解數組必須要講到指針,這樣就會融會貫通,靈活運用,而不是按部就班,照葫蘆畫葫蘆,因為照葫蘆畫瓢在你不知道是怎麽個回事的情況下,出錯很正常,你還不會改,好,進入正題:

數組,就是一堆連續的具有相同類型的內存空間,每個空間都可以存儲一個本數組的類型的元素。首先,要想用數組,既然知道它是用來存儲數據的,那肯定得要空間,就是得先聲明,先問計算機要空間。例如:

int main(void)
{
    int a[3];
    
    return 0;
}

這段代碼中就一句語句,int a[3]; 這句語句就是告訴編譯器,給我在內存上取一片空間給我用,這片空間是連續的三個int類型的空間,這塊空間就歸你使用,在使用時要註意,在數組中可以直接用數組名加下標的方式來對數組中的元素進行操作,但是下標都是從0開始,到n-1個一共n個,就像上面的數組,它的三個元素分別用a[0],a[1],a[2]來表示,如果你在程序中用到的下標超過了0到2這個範圍,編譯時候不會出錯,編譯器不會檢查這種錯誤,但是運行是就會出錯,在linux上的報錯就是段錯誤,段錯誤的意思就是你使用了未定義的空間,就是使用了不屬於你的空間,好,看以下代碼

#include<stdio.h>
int main(void)
{
    int a[3],i;
    for(i = 0; i < 3; i++)
        scanf("%d",&a[i]);
    for(i = 0; i < 3; i++)
        printf("%d ",a[i]);
    printf("\n");

    return 0;
}

處理數組一般都用循環處理,一維數據用一個循環,二維數組用兩個循環(下面講),循環中i從0開始到n-1結束,剛好對應了數組的下標。在第一個循環中,每次循環依次給a[0],a[1],a[2],賦值,他們三就代表了三個變量,所以取地址符&是必不可少的,然後第二個循環是依次輸出三個數,讀者在試代碼時候,輸入時每個數字中間以空格隔開,最後用回車結束輸入;

數組和指針關系非常密切,對指針不了解的請先看我另一篇文章,指針http://www.cnblogs.com/wangweigang/p/8990237.html

數組在程序中,編譯器會將它優化成指針,在你聲明了int a[3]; 這個數組時,這個數組名就代表了第一個元素的地址,也就是說,這個數組名就是指向這個數組的第一個元素的指針

#include<stdio.h>
int main(void)
{
    int a[3],i;
    for(i = 0; i < 3; i++)
        scanf("%d",&*(a+i));
    for(i = 0; i < 3
; i++) printf("%d ",*(a+i)); printf("\n"); return 0; }

在這個程序中,我把a[i]換成了*(a+i) 編譯運行和上面一模一樣,沒一點毛病,也就驗證了我剛才說的,所以說在程序中,可以有很多種表示數組的方法

#include<stdio.h>
int main(void)
{
    int a[3],i;
    int *p = a;
    
    for(i = 0; i < 3; i++)
        scanf("%d",&a[i]);
    for(i = 0; i < 3; i++)
        printf("%d ",a[i]);
    printf("\n");
    
    a[2] = 10;
    printf("%d\n",a[2]);
    2[a] = 11;
    printf("%d\n",2[a]);
    
    p[2] = 4;
    printf("%d\n",p[2]);
    2[p] = 5;
    printf("%d\n",2[p]);

    return 0;
}

這個程序也沒一點問題,運行結果也是你所想象的那樣,可能你這就有些疑問了,你說a[i]和*(a+i)可以互換,我指針p指向了數組a,我當然既可以*(p+2)也可以p[2],這些沒問題,但你這2[a],2[p]是什麽鬼,不要驚訝,因為我說過,數組這程序中編譯器都會換成指針,好那我*(a+2)和*(2+a)沒啥區別啊,同樣,那我a[2]和2[a]也沒啥區別唄,編譯器在編譯過程中只是把方括號的形式轉換成了解地址符*,圓括號和加號而已,所以如果你在看別人程序時候發現了這樣的代碼 2[a],2[p],0[a]之類的不要驚訝,只能說明寫代碼的人比較調皮而已。

順便說一下,由於這個數組的每個元素都是一個int類型的變量,所以指針就定義成指向int變量的指針就行,理解這個會在我另一篇指針和二維數組中對於指向二維數組的指針的聲明的剖析有很大的幫助。

那好,到這裏你就可能要問了,我數組會用就行了,你給我講指針幹嘛用的,我要是在程序中像上面那樣寫不是多此一舉嗎。

這裏就牽扯到函數了,在函數傳參過程中,數組會變成指針,而且函數只能改變一個變量,即用返回值來賦值給這個變量,你要是想改變多個變量就得用指針,請看這個程序

技術分享圖片

技術分享圖片

這個程序是老師的一個作業題,要求用三個函數來實現對數組的輸入,排序和輸出,在這個程序中,你會發現,在輸入和排序的時候,在其他函數中改變數組中元素的值,main函數的數組的值也會改變,參照上面我所說的,數組在傳參的時候就是指針,然後就利用了指針進行了間接的賦值,所以會改變原函數中數組的值。所以在以後程序中,只要見指針是指向數組的,或者數組是參數的,都可以用兩種表示方法來進行操作,習慣哪種就用哪種。

指針和數組先到這裏,更多關於指針和數組的會在我的指針和二維數組中給大家詳細介紹

原創,轉載標明出處,謝謝!!

數組和指針