代码:
#include <stdio.h>char a = 2;
char* p = &a;
char** d = &p;int main(){printf("a -> %d, &a -> %p\n", a, &a);printf("*p -> %d, p -> %p, &p -> %p\n", *p, p, &p);printf("**d-> %d, *d -> %p, d -> %p, &d -> %p\n", **d, *d, d, &d);
}
输出:
分析上述代码本质可以由下图描述:
参照上图先分析一阶指针,将&a赋值给p,那么p就能通过地址解析出p的值,等效通过&a找到a的值,修改p等效修改a
a,p,d的值能改变但是其对应地址&a, &p, &d的地址不能改变,p解析p本质过程就是通过p的值找到其指向的&a, 再由&a找到其对应的值a,即p和a都指向2,改变*p的值,那么a的值也会变
上部分是一阶指针部分,二阶指针只用看如下部分:
同理d指向&p,d解析出d的过程本质上就是d找到与之对应的&p,再由&p找到其对应的p,p与d指向同一个值,改变*d指向的值那么p指向的值也会变
一阶指针修改值代码:
#include <stdio.h>char a = 2;
char* p = &a; void Function_AsValue(char* temp){printf("a -> %d, &a -> %p\n", a, &a);printf("*temp -> %d, temp -> %p\n", *temp, temp);printf("*p -> %d, p -> %p\n", *p, p);*temp = *temp + 1;
}int main(){Function_AsValue(&a);printf("%d", a);
}
输出:
二阶指针修改值代码:
#include <stdio.h>char x[3] = {'V', 'A'};char* a = x;
char** p = &a;void Function_AsValue(char** temp){//printf("*x -> %c, x -> %p\n");printf("*a -> %c, a -> %p\n", *a, a);printf("**temp -> %c, *temp -> %p\n", **temp, *temp);printf("**p -> %c, *p -> %p\n", **p, *p);(*temp) ++; // *temp解析出a,再让a对应的值 + 1
}int main(){Function_AsValue(&a);printf("%c", *a);
}
输出:
a本来的值是x,通过函数改变a对应的值为x + 1,x对应数组首个字符V, x + 1对应数组第二个字符A,所以输出A