C语言指针是一个经常使用的变量,可是经常在二级指针三级指针中搞混,指针的本质就是一个int型的变量,只不过这个变量是内存块的地址,通过在这个变量前面加星号可以间接的访问这个内存块的内容。通过下面的示例可以清晰的明白指针的本质,
#include <stdio.h>
typedef struct {
int age;
char name[110];
}teracher;
int get(teracher **p)
{
teracher *tem = NULL;
tem = malloc(sizeof(struct teracher));
if (tem == NULL) {
return -1;
}
*p = tem;
return 0;
}
int main(int argc char **argv)
{
teracher *t1 = NULL;
get(&t1);
free(t1);
return 0;
}
这个例子就是通过二级指针间接申请内存,我们看一下执行过程
先定义一个t1指针,t1的内容是空的,然后调用get()函数,将t1的地址赋值给p,这样就可以通过*p来修改t1的内容,
然后在get()函数中,定义一个tem的指针,tem内容也是空的,
然后申请一个teracher类型大小的空间,将首地址赋值给tem,这样tem就保存着刚才申请内存区的首地址,通过*tem就可以访问申请的内存区,
然后将tem的内容赋值给*p,也就是将tem的内容赋值给t1,也相当于将刚才申请的内存块首地址赋值给了t1,
这样就相当于间接申请了内存给t1.然后就可以通过*t1间接修改刚才申请内存块的值。
最后我们得到的结论就是:指针变量就是存放的地址,通过地址加*号来间接访问内存。