short int i = 50;
short int *p = &i;
內存佈局:
i 地址 5~6(2 字節),值 50p 地址 11~14(4 字節),值 5(即 &i)

short int **pp = &p; // pp 存儲 p 的地址(11)
內存示意:

pp 指向 p*pp 等價於 p(值為 5)**pp 等價於 *p 即 i(值為 50)需求:在函數內為指針分配內存或修改其指向,需傳遞指針的地址。
void find1(char array[], char search, char *p) {
// 修改 p 只影響副本,外部實參不變
p = array + i; // 外部 pa 仍為 NULL
}
void find2(char array[], char search, char **pp) {
// 通過 *pp 修改外部指針指向
*pp = array + i; // 外部 pa 被正確修改
}
#include <stdio.h>
void find1(char array[], char search, char *p);
void find2(char array[], char search, char **pp);
int main(void) {
char str[] = "afsdfsdfd";
char a = 'd';
char *pa = NULL;
// find1(str, a, pa); // 失敗
find2(str, a, &pa); // 成功
if (pa == NULL) {
printf("沒找到!\n");
} else {
printf("找到了,pa = %#x\n", (unsigned int)pa);
}
return 0;
}
void find1(char array[], char search, char *p) {
for (int i = 0; array[i] != '\0'; i++) {
if (array[i] == search) {
p = &array[i];
break;
}
}
}
void find2(char array[], char search, char **pp) {
for (int i = 0; array[i] != '\0'; i++) {
if (array[i] == search) {
*pp = &array[i];
break;
}
}
}
找到了,pa = 0x12ff77
| 場景 | 參數類型 | 函數內操作 | 外部影響 |
|---|---|---|---|
| 修改指針指向的值 | T *p | *p = val | 生效 |
| 修改指針本身(指向) | T **pp | *pp = new_addr | 生效 |
| 修改指針本身 | T *p | p = new_addr | 不生效(副本) |
int **matrix = malloc(rows * sizeof(int*))next 指針,傳 Node **prev_nextchar **argv 指向字符串指針陣列