簡單易懂的計算機二級C語言知識點講解——《指針與數組》

C語言中的指針與數組

引言

相信指針與數組是不少同學在初學C語言時遇見的大魔王。指針的的概念弄不清,導致程序寫起來極易出錯, 我遇見的運行錯誤有九成都是指針使用不當導致的,可以說,指針與數組是在學習C語言的道路上,必須擊敗的一個小BOSS。
//注:本文中可能有部分詞彙初學者不明白其含義,沒有關係的,這些不會造成您閱讀本博文的障礙,網上搜一下含義,大致理解它的意思即可。


指針

指針的概念

指針是一種特殊的變量類型,它的值直接指向存在電腦存儲器中另一個地方的值。由於通過地址能找到所需的變量單元,可以說,地址指向該變量單元,因而得名叫指針。
舉個例子,我們現在知道存儲單元中有一個變量 a,知道他的值,但假如我們不知道他在存儲單元裏的位置,那我們將無法改變這個變量的值。但是,我們現在申請了一個特殊的變量,他可以儲存 a 的地址,獲取到 a 的地址之後,我們就可以找到它在內存中的位置,就可以更改內存變量的值了。當然,這只是個例子,只是爲了方便大家理解指針的含義而已,在C語言中,變量會在它的作用域中保留它的地址,直接用個取址符&就可獲取其地址。

指針用法舉例

指針的聲明格式如下:
[變量類型] * [指針名稱]
例如:int * p;

下面展示一個指針運用的程序

#include <stdio.h>
int main()
{
    int a = 10;//聲明一個int變量
    int *p = &a;//聲明一個指針,指向變量a
    //int *p = a;//注意,這行是錯誤的,不能直接將int型賦值給指針變量
    //在定義了指針之後,在指針變量前加一個*,即代表的是p所指的變量
    printf("a的值爲%d,*p的值爲%d\n",a,*p);
    return 0;
}

程序輸出的結果爲:a的值爲10,p的值爲10
可見:
1.不能直接將int型變量賦值給指針變量
2.在定義了指針之後,在指針變量前加一個
,即代表的是p所指的變量

第一點很容易理解,指針作爲儲存地址的特殊變量,自然不能存儲普通變量類型的值,只可以賦值給它地址作爲值,也就是我們所謂的指向這個變量。

第二點是取值符 * 的演示:即 * p 的表達式等價於 a 的表達式。注意很多同學會把定義指針時的 * 和取值符 * 弄混,其實它們兩個並無聯繫。

函數間的指針傳參

上面提到過變量在它的作用域中可以直接通過取址符獲得變量在內存中的地址,但如果是函數間傳參的話,這個方法就不得行了。
舉個例子

#include <stdio.h>
void test(int a)
{
    a=11;
}
int main()
{
    int a=10;
    test(a);
    printf("a=%d\n",a);
    return 0;
}

輸出的結果:a=10
可見,test函數並沒能做到改變a的值。其實原因很簡單,傳參數a,傳的只是參數a的數值,並不是它的地址。在函數test中,並不知道a的地址爲多少,自然也就無法更改a的值(test中的變量a是個型參,與main中的a不同)。

那我們該如何解決這個問題呢?這時,指針的作用就來了!

#include <stdio.h>
void test(int *p)
{
    *p=11;
}
int main()
{
    int a=10;
    test(&a);
    printf("a=%d\n",a);
    return 0;
}

輸出的結果:a=11
可見,如果把a的地址作爲指針傳過去,test函數就有辦法通過指針來修改a的值了,是不是很有趣呢?


數組

數組的概念

所謂數組,是相同數據類型的元素按一定順序排列的集合。若將有限個類型相同的變量的集合命名,那麼這個名稱爲數組名。在C語言中, 數組屬於構造數據類型。一個數組可以分解爲多個數組元素,這些數組元素可以是基本數據類型或是構造類型。因此按數組元素的類型不同,數組又可分爲數值數組、字符數組、指針數組、結構數組等各種類別。

數組運用舉例

在C語言中,數組的定義形式爲 [變量類型] [數組名稱][]
例如:int a[];

舉個栗子,假如我現在要從10個數中選擇最大的一個數輸出,該怎麼編碼?
如果我們不會用數組的話,我們就要定義10個變量了,哦,想想都麻煩死了。。。
閒聊:還記得我剛學習C語言時,計算機導論老師叫我寫一個8個數的排序,我就真的定義了8個變量,最後把老師笑死了(計算機導論老師不知道我們當時還沒學數組)

#include <stdio.h>
int max(int a,int b)//比較大小函數
{
    return a>b?a:b;
}
int main()
{
    int a[10]={6,7,3,9,1,0,6,5,10,4};//待處理的10個數
    int ans = a[0];//作爲答案的變量
    int i;
    
    for(i=1;i<10;i++)
    {
        ans=max(ans,a[i]);//依次比較大小,保留較小的
    }
    printf("Max = %d\n",ans);
    return 0;
}

運行的結果:Max = 10
可見,運用數組的話,能大大提高我們編程的效率,不用傻傻地定義10個變量了

數組與指針的關係

其實說白了,數組就是運用了指針的思想來構建的。
數組其實就是在內存中申請一段連續的內存單元,然後再把這一段內存單元的首單元的地址儲存起來,就構成了數組。比如我們要找到a[6],計算機先找到數組a的首地址,然後再向後移動6個單元格,就是我們要找的a[6]了。
舉個例子

#include <stdio.h>

int main()
{
    int a[10];
    
    printf("數組a的首地址:a=%x\n a[0]的地址爲:&a[0]=%x\n a[6]的地址爲:&a[6]=%x\n",a,&a[0],&a[6]);
    
    return 0;
}

輸出的結果:
數組a的首地址:a=5fbff7c0
a[0]的地址爲:&a[0]=5fbff7c0
a[6]的地址爲:&a[6]=5fbff7d8

注:%x爲16進制輸出
可見,a的地址和a[0]的地址是一樣的,可見數組名a的實質,其實就是指向數組a首地址的指針

二維數組

二維數組其實就是有兩個維度的數組
例如 int a[10][10];
類似的,還有三維數組,四位數組。

舉個例子:

#include <stdio.h>

int main()
{
    int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
    //假設第一個維度代表的是行,第二個維度代表的是列
    //我們想知道第2行,第三列的數據就直接用a[1][2]就可以了
    printf("a[1][2]=%d\n",a[1][2]);
    return 0;
}

輸出的結果:a[1][2]=6
注:C語言中的序列都是從0開始數

因爲這篇博文主要是講的指針與數組的關係,所以二維數組的概念就點到爲止吧


總結

這麼看起來,其實指針和數組還是挺簡單的對吧?只要理解了它的概念,並多敲代碼,就能做到熟練的運用它們。


注:未經作者允許,請勿私自轉載博文。
參考資料:百度百科(指針和數組的概念)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章