c語言 指針零基礎講解

1.指針是什麼(可能有點難理解)

指針的是啥?

指針實際上就是地址,地址就是系統給定的編號,編號就是一個個內存單元。

在某種情況來說指針=地址=編號=內存單元。

指針就是地址,顧名思義,就是可以用來尋找目標的。

所以指針變量就是存放地址的變量。

當然我們口頭上常說的指針就是指針變量~

那指針是怎麼產生的呢,也就是說內存是怎樣產生的呢?

我們知道我們的計算機就是32位或64位系統組成,這32與64在物理上就是32根物理電線或64根物理電線組成。這物理電線通電時,就會產生高電頻,從而產生電信號,再由電信號轉變為數字信號,在我們計算機上就顯示數字信號,我們知道計算機隻能識別二進制系列數字,所以這就最終變為1與0組成的數字信號。最終就有二的三十二或六十四次方的存儲空間,經過換算,也就是4或8個GB,也就是內存,當然這些都是有硬件決定的。

而指針的大小也就是4個字節或八個字節組成(與指針的類型無關)

原理:指針的大小由系統決定,比如32位系統,就由32給比特位組成,

比如00000000000000000000000000000001

也就是4個字節~

也就是說無論是char類型還是int類型指針大小都是4或8(在64位系統上)個字節。

2. 指針和指針的類型

int a=10;

int* pa=&a;     //此時int*就是指針pa的類型,而pa就是指針變量,來儲存地址的~

指針類型分很多種如int,float,double等;

既然大小都是四個字節,那為什麼要區分不同類型的指針呢?

這就要說到指針類型的特點:

1.指針類型決定解引用時訪問幾個字節;一個int類型指針就直接訪問4給字節的空間,一個char類型就隻能訪問一個空間的內存等等

2.指針類型決定瞭指針向前一步或向後一步能走多遠的距離。就比如說int類型的指針加一個單位就相當於走瞭四個字節的空間。

從圖上就可以看到,當指針變量的類型是int型時,指針變量加一,地址就變瞭四個字節的,當指針是char類型的時候,指針變量加一就變成跳過一個字節的單位瞭。

可以連續定義多個指針如:

int*pa,*pb;(並不是int*pa,pb);

3.野指針

所謂野指針就是沒有地址的指針,系統就會出現錯誤,都是造成野指針的情況下,系統往往都不會報錯,都不能說明,野指針就是正確的,就比如說,一個小偷,沒被進警察抓到就能說明他的行為是對的嗎?回答是,當然不能。

雖然最終程序依然可以運行,但是最終的結果並不會是預期的那樣。這時候就占用瞭一塊未申請的空間瞭。這塊空間的內容是隨機的。

那野指針是怎樣造成的呢?怎樣避免野指針的發生呢?

造成原因:

1.由於指針未定義,就開始使用。

比如:

          int*p;

          *p=20;

2.指針的越界訪問,這常常體現在數組裡。

這就出現溢出的情況瞭~

3.指針指向的空間釋放,在函數中很常見。

既然出現瞭野指針,那有什麼辦法可以避免野指針的出現呢?

解決方案

1.給指針初始話

2.小心指針越界

3.指針指向的空間釋放後,及時定位NULL,防止被再次使用。

4.避免返回局部變量地址。

5.指針使用前先檢測有效性。

4.指針的運算

4.1 指針的加減整數的運算

指針加減一個整數,地址就會有相應的變化;

4.2 指針-指針

這裡的指針-指針,最終的結果是中間的元素個數(而不是中間有幾個字節)

幾個字節由指針的類型決定;

當然,既然由減,肯定有人會問為什麼沒加呢(問得好,下次別問瞭)

兩指針相減,得到的是兩個地址中間的元素個數,那相加就沒有什麼特別的含義瞭,所以不存在相加。

舉個例子

我們平時計算字符串的長度通常有三種方法(1.計數器 2.遞歸 3.就是指針-指針)

前兩種方法就不講瞭~                 (前提是兩個指針是指向同一塊空間)

5.指針與數組

指針是地址,口頭上也就是指針變量~

數組是什麼:數組就是相同類型數據的集合~

這似乎兩者沒什麼關系,但是實際上我們可以通過指針來訪問數組。

事實證明:*(p+i)    *(arr+i)    arr[i]   p[i] 這四種情況的結果是相同的,都可以訪問元素

他們代表的意義是相同的!!!

6.二級指針

你可能會擔心很難(我指針都不懂,還二級指針,不看瞭)

別~~~~

其實二級與多級指針都很容易

二級指針指向的就是存放一級指針的地址(指針)

 int main()
{
    int a = 10;
    int* pa = &a;
    int** ppa = &pa;//ppa就是一個二級指針
    **ppa = 20;
    printf("%d\n", a);


    //int*** pppa = &ppa;//pppa就是三級指針

    return 0;
}

7.指針數組

指針數組是數組還是指針呢?

答案是:數組,是用來存放指針的數組。

除瞭指針數組外,其實我們還學習瞭整形數組和浮點型數組;

比如:

int* arr[4]={&a,&b,&c,&d}

&a
&b
&c
&d

int arr[4]={a,b,c,d}

a
b
c
d

對比一下,是不是很容易理解瞭,數組就是裝有相同類型的數據,而指針數組也一樣,隻是裡面裝的都是一個個指針,不要想的很難哦~

到此這篇關於c語言 指針零基礎講解的文章就介紹到這瞭,更多相關c語言 指針內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: