1. 程式人生 > >C語言指標(其實指標沒那麼神祕)

C語言指標(其實指標沒那麼神祕)

剛剛開始學習C語言的時候,每當聽到指標二字,總是覺得它既複雜又難懂,今天這裡看看指標的本質。

這裡指標的理論概念就不在贅述;

首先,為了便於講解,這裡定義了一個全域性的整型變數a,定義全域性變數是因為它的記憶體位置固定,方便後面有地址賦值。

#include <stdio.h>

int a = 100;

int main()
{
        printf("%p\n", &a);
        return 0;
} 

輸出:
這裡寫圖片描述

看看下面這幾行程式碼,(int )0x00424D8C = 1000; 這條語句看上去高逼格很神祕, 現在來剖析它,0x00424D8C 是剛才定義的全域性變數a的儲存地址,(int )這是把這塊地址強制轉換為整型指標型別(也許到這裡你還不瞭解指標的概念,沒關係,堅持看下去),最左邊的

表示取這塊記憶體的值,當然,這裡是為了給這塊記憶體賦值。

#include <stdio.h>

int a = 100;

int main()
{
        printf("%p\n", &a);
        printf("a = %d\n", a);

        //a = 1000;
        *(int *)0x00424D8C = 1000;

        printf("a = %d\n", a);
        return 0;
} 

看這樣做也能修改a的值
這裡寫圖片描述

這幾行程式碼,和剛才的沒多大差別,只不過是把地址存放在了add變數裡,看上去更加直觀,所以不用多說。

#include <stdio.h>

int a = 100;

int main()
{
        printf("%p\n", &a);
        printf("a = %d\n", a);

        int add = 0x00424D8C;    
        *(int*)add = 1000;
        printf("a = %d\n", a);
        return 0;
} 

好了說了這麼多, 現在來看看最終版本的指標, 這裡定義的int *add;就完全等價於前面所定義的那些複雜的形式。這就是所謂的指標它的本質所在。
這裡把a的地址賦值給add, 就等同於前面的直接把1000賦值給a的記憶體地址,因為這裡add是指向存放a的儲存地址的。
具體的說,這裡add的值為:0x00424D8C, *add的值為1000。

        a = 1000;
        int *add = &a;
#include <stdio.h>

int a = 100;

int main()
{
        printf("%p\n", &a);
        printf("a = %d\n", a);

        a = 1000;
        int *add = &a;

        printf("a = %d\n", a);
        return 0;
} 

這裡寫圖片描述

說了這麼多,前面演示的就是指標從繁到簡的一個過程。但是,千萬要記住,真正使用的時候應該避免使用前面幾種定義方法,因為它實在是不具有可讀性,那麼複雜形勢的程式碼根本沒必要出現在程式裡面。
雖然實際的運用中指標並沒有這麼簡單,但這就是指標的本質,瞭解了本質,加以練習就能熟練運用。