概要
指针的调用和赋值的简单解析
技术细节
1、地址的调用和赋值
void f1(int* q) { *q = 3; } int main(void) { int i = 2; int* p; f1(p); printf("%d\n", *p); getchar(); return 0; }
显示结果错误,p没有初始化,随意的指向了内存的一个空间,又把这个地址给了q,及p,q指向了一个相同的内存空间,*q修改了这个内存空间的内容是错误的,不确定的一个内存空间的内容是无法读写的。
void f1(int* q) { q = (int*)malloc(4); *q = 3; } int main(void) { int i = 2; int* p = &i; f1(p); printf("%d\n", *p); getchar(); return 0; }
输出答案是2不是3,首先p指向i的地址,则p == 2,把p地址赋给q,则p,q共同指向i地址,这时若q = 3,则i的值会变。但在函数里却给q分配了一个新的内存空间,这时q指向这个动态内存空间,跟p没关系,p依然指向i地址,这时q=3不会影响i的值,所以p依然为2
2、地址的地址调用和赋值
void f1(int** q) { *q = (int*)malloc(4); **q = 3; } int main(void) { int i = 2; int* p = &i; f1(&p); printf("%d\n", *p); free(p); getchar(); return 0; }
答案为3不是2,首先把i地址赋给p,这时p指向i地址,p==2。然后把p地址的地址赋给q,这时q指向p地址的地址,q便是p地址,修改q的值便是修改p地址,这时若给q申请一个内存空间,那么q和p都指向这个内存空间,p不在指向i地址,这时给**q赋值,就是把q和p共同指向的内容空间放入值,那么*p就是这个值,用完要释放这个内存空间。