2023年1月9日 星期一

C語言指針

 線上測試

※基本型態指針

// 包括 short int long float double chat

#include <stdio.h>

void test(int *d)  {

    *d = 100; // 將 d 這個位址對應的值,改成 100; 寫 d 或 &d 都會報錯

}


int main() {

    int digit = 2;

    test(&digit);

    printf("digit=%d", digit);

    return 0;

}


在變數前加上 &,表示傳的是記憶體位址;

    在變數前加上 *,表示接收記憶體位址

    所以可以這樣宣告變數 int *x = &digit;   test(x);

※這樣的好處是方法裡改變的值,會影響調用方的值

※只有傳的時候給 &,接收時給 * 才不會報錯,其他都會報錯



※陣列指針

#include <stdio.h>


int main() {

    int arr[] = {1, 2, 3};


    // 注意是用 int *p 來接,不是 int[]*p,會報錯

    int *p = arr; // 指向的是 arr[0]的記憶體位址,陣列不可打 &arr,因為它有多個值,要傳其中一個值可用 &arr[0],但代表整體就不能有 &,會報錯

    

    // 以下三個結果一樣

    printf("%p\n", &arr[0]);

    printf("%p\n", arr);

    printf("%p\n", p);

    

    // 以下三個結果一樣,和上面差 4,也就是 4 Bytes

    printf("%p\n", &arr[1]);

    printf("%p\n", arr + 1);

    printf("%p\n", p + 1);

    

    // 以下三個結果都是 2,也就是取值

    printf("%d\n", *(&arr[1]));

    printf("%d\n", *(arr + 1));

    printf("%d\n", *(p + 1));

    

    printf("%p\n", &arr + 1); // &arr 是整個 arr 的記憶體位址,如果佔用 4Bytes,結果將是 4Bytes 結束再 + 1,可用 sizeof() 查看佔多少 Byte

    return 0;

}



※字串指針

int main() {

    char *p = "a";

    printf("string=%s", p);

    

    // int *i = 9;

    // printf("digit=%d", i);

    return 0;

}

※字串指針可以直接賦值,其他不行


※陣列裡放指針

int main() {

    char *s1 = "ab";

    char *s2 = "cd";

    char *s3 = "ef";

    

    char *s[3] = {s1, s2, s3}; // 和陣列就差一個 *,只有字串可以這樣寫

    printf("string=%p\n", s);

    printf("%s", s[1]);


    return 0;

}





沒有留言:

張貼留言