C 語言筆記:指標

練習題

題目取自軟韌體工程師的 0x10 個問題C/C++ - 常見 C 語言觀念題目總整理,題目下一行反白是答案。

如果這邊能全對表示對指標有一定的掌握程度,不需要往下看了。 

  1. 一個整數
    (An integer)
    int a;

  2. 一個指向整數的指標
    (A pointer to an integer)
    int *a;

  3. 一個指向指標的指標,它指向的指標是指向一個整型數
    (A pointer to a pointer to an integer)
    int **a;

  4. 一個有10個整數型的陣列
    (An array of 10 integers)
    int a[10];

  5. 一個有10個指標的陣列,該指標是指向一個整數型的
    (An array of 10 pointers to integers)
    int *a[10];

  6. 一個指向有10個整數型陣列的指標
    (A pointer to an array of 10 integers)
    int (*a )[10];

  7. 一個指向函數的指標,該函數有一個整數型參數並返回一個整數
    (A pointer to a function that takes an integer as an argument and returns an integer)
    int (*a)(int);

  8. 一個有10個指標的陣列,該指標指向一個函數,該函數有一個整數型參數並返回一個整數
    (An array of ten pointers to functions that take an integer argument and return an integer)
    int (*a[10])(int);

  9. const int * a; 的意思
    一個 pointer,指向 const int 變數。

  10. int const * a; 的意思
    一個 pointer,指向 const int 變數。

  11. int * const a; 的意思
    一個 const pointer,指向 int 變數。

  12. int const * const a; 的意思
    一個 const pointer,指向 const int 變數。


什麼是指標?

一個指向某個儲存位址的變數。

如果變數是房子,那指標就相當於地址。

int arr[5] = {10, 20, 30, 40, 50};
int x = 10;
int *p = &x;  // p 是一個指標,指向 x 的位址
printf("%d\n", *p);  // 輸出 10

  • & : 取得位址

  • * :  宣告或解參照(dereference)
    int *p; / *p = 5;

 

指標應用 

陣列

int *p = arr;
printf("%d\n", arr[2]); // 30
printf("%d\n", *(p + 2)); // 30

  • arr[i] 其實等價於 *(arr + i)

  • arr 是個「陣列的首地址」,可自動轉型為 int *

函數 

#include <stdio.h>

void greet() {
    printf("Hello!\n");
}
int main() {
    void (*funcPtr)() = greet;  // 宣告一個指向 void 函數的指標
    funcPtr();  // 呼叫函數
    return 0;
}

使用情境: 

  • 常用於 callback function,常見用法為 qsort

    void qsort(void *base, size_t num, size_t size, int (*compare)(const void*, const void*));

  • 用於 multithread 
    在 C 語言中建立多執行緒時,常見的 POSIX pthread_create() 函數需要你提供一個 函數指標作為執行緒的進入點。這個函數指標就是 thread 啟動時要執行的 callback function。
    下面是 pthread_create 的原型:

    #define _OPEN_THREADS
    #include <pthread.h>
    int pthread_create(pthread_t *thread,
                       const pthread_attr_t *attr,
                       void *(*start_routine)(void *),
                       void *arg);

    其中 start_routine 是一個函數指標,指向如下函數:
    void* function_name(void* arg);

    這表示我們可以將任何符合這個格式的函數指標傳入 pthread_create(),讓它成為該 thread 的工作入口。典型用法如下:
    void* worker(void* arg) {
        printf("Thread received: %s\n", (char*)arg);
        return NULL;
    }
    
    int main() {
        pthread_t tid;
        const char* msg = "Hello, Thread!";
        pthread_create(&tid, NULL, worker, (void*)msg);
        pthread_join(tid, NULL);
        return 0;
    }


  

 

 

 


 

 

 

 

留言