C 語言筆記:指標
練習題
題目取自軟韌體工程師的 0x10 個問題與C/C++ - 常見 C 語言觀念題目總整理,題目下一行反白是答案。
如果這邊能全對表示對指標有一定的掌握程度,不需要往下看了。
一個整數
(An integer)
int a;一個指向整數的指標
(A pointer to an integer)
int *a;一個指向指標的指標,它指向的指標是指向一個整型數
(A pointer to a pointer to an integer)
int **a;一個有10個整數型的陣列
(An array of 10 integers)
int a[10];一個有10個指標的陣列,該指標是指向一個整數型的
(An array of 10 pointers to integers)
int *a[10];一個指向有10個整數型陣列的指標
(A pointer to an array of 10 integers)
int (*a )[10];一個指向函數的指標,該函數有一個整數型參數並返回一個整數
(A pointer to a function that takes an integer as an argument and returns an integer)
int (*a)(int);一個有10個指標的陣列,該指標指向一個函數,該函數有一個整數型參數並返回一個整數
(An array of ten pointers to functions that take an integer argument and return an integer)
int (*a[10])(int);const int * a; 的意思
一個 pointer,指向 const int 變數。int const * a; 的意思
一個 pointer,指向 const int 變數。int * const a; 的意思
一個 const pointer,指向 int 變數。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)); // 30arr[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; }
留言
張貼留言