小试牛刀
学习linux也有一段时间了,之前看了许多人的博文,收获很大。
现在想把自己平时学习所收获的一些东西分享出来。
近期应该会分享一些自己在学习c语言以及linux驱动方面的一些个人见解。
由于本人还是在校学生,不足和错误的地方希望大家可以指出来,共同进步。
今天,先和大家分享一下自己在学习 C语言中有关二级指针的学习心得
首先我们先来看一段代码(曾经的一道面试题)
问:
运行test函数有什么结果?
void setmemory(char *p,int num){
p = (char *)malloc(num);
}
void test(void){
char *str = NULL;
setmemory(str,100);
strcpy(str,"hello");
printf(str);
}
大家应该要清楚,setmemory()这个函数是无法成功的为str申请100个空间的,反而如果多次执行还会消耗内存。P在函数setmemory( )中只是一个局部变量,无法修改上层函数的值。原因很简单,它并没有拿到str的地址。所以也就无法对其进行修改。
修改的方式很简单:
(1)
void setmemory(char **p,int num){
*p = (char *)malloc(num);
}
void test(void){
char *str = NULL;
setmemory(&str,100);
strcpy(str,"hello");
printf(str);
}
这样就可以成功的拿到str的地址,这样再对其指向的地址空间的操作就可以成功。
这里就涉及到了c语言当中的二级指针问题,这段代码为了更好理解我们可以这么看:
(2)
char*
void setmemory(time_t *p,int num){
p = (char *)malloc(num);
}
void test(void){
time_t str;
setmemory(&str,100);
strcpy(str,"hello");
printf(str);
}
可以这样理解char* 以及 其它类型 如:int 等 都是一种数据类型,我们在想通过其它函数修改他们应该要获取到他们的地址,不是说看到了char * 就认为他就是我们需要的地址,char*str 中的str只是一个指针变量, 我们要修改其内容,因此要获得str本身的地址。二级指针 char **p 等价于 char *p[ ];也就是指针数组,里面存放的是指针。
下面很关键
看张图:
关于二级指针char **p
首先看*p ,也就是那个圆圈。它必然指向一块地址,这里也就是p[0]
其次,看char *,也就是说p[ ]中,指向的是一块内存,什么内存呢?就是为char型的内存。
因此有些朋友常常写 char**p = “hello”;这样的语句时会出现段错误,就是因为没有对一级指针进行初始化(也就第一个矩形)导致了其直接指向了下一快地址空间,造成指针指飞了也就是:
回到例子当中:
换句话说在(1)中 char *str 是一个一级指针,而将str的地址传给函数setmemory( ),使得char**p中的p 成功的取得了str的地址,也就是图中的圆圈,*p 就相当于取得其地址,也就是到达第一个矩形**p就相当于取得其内容,也就是到达第二块矩形。
这就是为什么函数需要声明为char ** 的原因,只有这样才能取得上层函数参数的地址。
第一篇小分享,有什么问题可以及时评论。