一把梭系列 ~ C語言範例 (0016) [指標變數的位址與運算]

一把梭系列 ~ C語言範例 (0016) [指標變數的位址與運算]

一把梭系列 ~ C語言範例 (0016) [指標變數的位址與運算]


資料來源: https://openhome.cc/Gossip/CGossip/Pointer.html

https://openhome.cc/Gossip/CGossip/PointerArithmetic.html


線上執行: https://www.tutorialspoint.com/compile_c_online.php


★前言:


★主題:


    程式語言變數提供具名稱的記憶體儲存空間,一個變數關聯『一個資料型態』、『儲存的值』與『儲存空間的位址值』。


    01.取址運算子(Address-of operator)
        如果想知道變數的記憶體位址,可以使用 & 取址運算子(Address-of operator),例如:

        int n = 10;
        printf("變數 n 的資料型態:int\n");
        printf("變數 n 儲存的值:%d\n", n);
        printf("變數 n 記憶體位址:%p\n", &n);

        
    02.宣告指標變數
        一般變數儲存的內容都是數值,而指標變數的儲存的值為某一個記憶體位址值,其宣告方法如下:

        //資料型態△*變數名稱01,*變數名稱02;
        //資料型態*△變數名稱01;
        //△是英文空格
        int *n,*m;
        float* f;
        char *c;

        
    03.設定指標變數內容與取出儲存位址處之值

        int n = 10;
        int *p='\0' ;
        
        printf("p 初始化儲存的位址:%p\n", p);
        printf("n 的位址:%p\n", &n);
        
        p=&n;//把n的的記憶體為只取出存放到指標變數中
        printf("p 儲存的位址:%p\n", p);
        printf("取出 p 儲存位址處之值:%d\n", *p);        

        
    04.指標的運算

        除了指定運算子=、取址運算子 & 與取值運算子 * 之外,還有 +、-、++、–、+= 與 -= 等運算子可以使用在指標上。


        指標的加法與減法與一般數值的加減法不同,在指標運算上加 1 ,是表示前進一個資料型態的記憶體長度』,例如

        int *p1='\0' ;
        float f=0;
        float *p2='\0';
        
        printf("p1 位址:%p\n", p1);
        printf("p1 + 1:%p\n", p1 + 1);
        printf("p1 + 2:%p\n", p1 + 2);

        p2=&f;
        printf("p2 位址:%p\n", p2);
        printf("p2 - 1:%p\n", p2 - 1);
        printf("p2 - 2:%p\n", p2 - 2);        


★code:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    //取址運算子(Address-of operator)
    int n = 10;
    printf("變數 n 的資料型態:int\n");
    printf("變數 n 儲存的值:%d\n", n);
    printf("變數 n 記憶體位址:%p\n\n", &n);

    //設定指標變數內容與取出儲存位址處之值
    int *p='\0' ;
    int* p3;

    printf("p 初始化儲存的位址:%p\n", p);
    printf("n 的位址:%p\n\n", &n);

    p=&n;//把n的的記憶體為只取出存放到指標變數中
    p3=p;
    printf("p 儲存的位址:%p\n", p);
    printf("取出 p 儲存位址處之值:%d,%d\n\n", *p,*p3);

    //指標的運算
    int *p1='\0' ;
    double d=0;
    double *p2;

    printf("p1 位址:%p\n", p1);
    printf("p1 + 1:%p\n", p1 + 1);
    printf("p1 + 2:%p\n\n", p1 + 2);

    p2=&d;
    printf("p2 位址:%p\n", p2);
    printf("p2 - 1:%p\n", p2 - 1);
    printf("p2 - 2:%p\n\n", p2 - 2);

    //記憶體大小
    printf("整數變數記憶體大小:%d\n", sizeof(int));
    printf("倍精度變數記憶體大小:%d\n", sizeof(double));
    printf("整數變數指標記憶體大小:%d\n", sizeof(int*));
    printf("倍精度變數指標記憶體大小:%d\n", sizeof(double*));
    return 0;
}


★結果:


★延伸說明/重點回顧:

    01.一個變數關聯『一個資料型態』、『儲存的值』與『儲存空間的位址值』三項數值
    
    02.一般變數和指標變數的差異只在於『儲存的值』內的資料內容,一般變數儲存普通數值,指標變數儲存一般變數的記憶體位址
    
    03.一般變數的配置記憶體大小由型態決定,指鰾變數配置記憶體大小由編譯器位元數決定(x32編譯器->4byte ; x64編譯器->8byte)

One thought on “一把梭系列 ~ C語言範例 (0016) [指標變數的位址與運算]

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *