關於C指針——和指針的第一次親密接觸

先看代碼:

#include<stdio.h>

int main(void){
    
    int a = 5;
    int b = 10;
    int *c;
    
    //輸出每個變量的地址
    printf("a的地址是 %p\n",&a);
    printf("b的地址是 %p\n",&b);
    printf("c的地址是 %p\n",&c);
    
    /*將a的地址賦予c*/
    c = &a;//此處需用到  ”&“來得到a的地址
    printf("c修改後的地址爲 %p\n",c);
    
    /* 通過c輸出a的內容*/
    printf("*c ---->%d\n",*c);
    
    /* 通過c修改a的內容*/
    *c = 10;
    printf("a---->%d\n",a);
    
    return 0;
}

然後我們看運行結果

在這裏插入圖片描述

我們首先聲明瞭int型變量 a,b 然後聲明瞭”指向int 的指針“類型的變量c

我們暫且先將c理解爲指向int 的指針

再看初始化完後內存中保存的樣子在這裏插入圖片描述

在c語言中,會存在 int類型,double類型,等。。同樣,c語言中也存在指針類型這樣的類型。
指針類型並不是單獨存在的,而是由其他類型派生出來的。。

由引用類型T派生的指針類型有時候稱爲’(指向)T的指針‘

因爲指針類型是類型,所以他也像其他類型一樣,有“指針類型的值和指針類型變量”,但有時,我們將“指針類型”,“指針類型變量”,“指針類型的值”簡單統稱爲—指針

因此 c就是一個指針類型變量-----指向int的指針,但此時併爲對它賦值。

接下來我們將a的地址賦予了c,此時c的值就是a的地址在這裏插入圖片描述

接下來:

在指針前面加*,可以表示指針指向的變量,因爲現在c指向a,所以c就等同於a。同理,修改c就相當於修改了a的值。

這是對後兩行輸出做的解釋

補充:

如果說c是 指向int的指針,但我們聲明變量時一般要遵循:

類型 變量名

因此,我們似乎聲明瞭一個名爲*c的變量。

所以我們可以寫成 int* c的形式。這樣更符合 類型 變量名 的形式。

但之後就會出現問題:
數組也是C語言的一種類型。。如果按上述所說的話。
C語言聲明數組時應該是:

int[] array;

很明顯,會報錯。這就產生了矛盾。。

反而,Java中可以這麼寫,但是Java爲了讓C程序員更好的轉向Java。也兼容了c語言定義數組的寫法。。

在這裏需要插一句:

C語言的語法本來就是不自然的,奇怪的而又變態的。

之後我會出一篇關於C語法的博客專門研究這“變態的”c語法。。。

歡迎吐槽評論

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