| 操作符 | 聲明時 | 使用時 |
|---|---|---|
* | 聲明指針變量 | 解引用(取值) |
& | — | 取地址(引用) |
int *ptr = &val; // ptr 存儲 val 的地址
*ptr = 20; // 通過指針修改 val 的值
比喻:指針=信封,地址=郵箱地址,取值=房子。擦掉信封地址換新地址,不影響原房子。
arr 不能作左值,ptr = arr 合法(實為 ptr = &arr[0])struct Person { int age; char *name; };
struct Person p = {25, "Tom"};
struct Person *ptr = &p;
ptr->age = 26; // 等價於 (*ptr).age
ptr->name = "Jerry";
. 用於結構體變量-> 用於結構體指針Node* Create() {
Node *head = NULL, *p1, *p2;
p1 = p2 = (Node*)malloc(sizeof(Node));
scanf("%d", &p1->data);
while (p1->data != 0) {
if (head == NULL) head = p1;
else p2->next = p1;
p2 = p1;
p1 = (Node*)malloc(sizeof(Node));
scanf("%d", &p1->data);
}
p2->next = NULL;
return head;
}
void insert(Node *head, int pos, int val) {
Node *tmp = head;
for (int i = 0; i < pos; i++) {
if (tmp == NULL) return;
if (i < pos - 1) tmp = tmp->next;
}
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = val;
newNode->next = tmp->next;
tmp->next = newNode;
}
int del(Node *head, int pos) {
Node *tmp = head;
for (int i = 0; i < pos; i++) {
if (tmp == NULL) return -1;
if (i < pos - 1) tmp = tmp->next;
}
int val = tmp->next->data;
tmp->next = tmp->next->next;
free(tmp->next); // 注意:應先保存再 free
return val;
}
data.txt)struct Score { int chinese, math, english, sum; };
struct Node {
char name[20], class[20], number[20];
struct Score score;
struct Node *next;
} *head, *p, *q, *u;
void Sort() {
// 統計節點數 n
for (int i = 1; i <= n; i++) {
u = head;
for (int j = 0; j < n - i; j++) {
p = u->next; q = p->next;
if (strcmp(p->class, q->class) > 0 ||
(strcmp(p->class, q->class) == 0 && p->score.sum < q->score.sum)) {
u->next = q;
p->next = q->next;
q->next = p;
}
u = u->next;
}
}
}
void Save() {
FILE *fp = fopen("C:\\data.txt", "w");
fprintf(fp, "班級 學號 姓名 語文 數學 英語 總成績\n");
for (u = head->next; u; u = u->next)
fprintf(fp, "%-11s%-11s%-15s%-6d%-6d%-6d%-d\n",
u->class, u->number, u->name,
u->score.chinese, u->score.math, u->score.english, u->score.sum);
fclose(fp);
}
「通過指針和鏈表的學習,發現 C 語言可以如此有意思、如此有成就感。同一個系統可以有多種實現方式,靈活運用指針實現動態內存管理,是 C 語言獨特的魅力所在。」
malloc 返回值、文件打開狀態)const 修飾只讀參數NULL