关于二级指针

来源:互联网 发布:集散流程方案设计优化 编辑:程序博客网 时间:2024/06/02 09:59

小试牛刀

学习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 ** 的原因,只有这样才能取得上层函数参数的地址。

第一篇小分享,有什么问题可以及时评论。

0 0
原创粉丝点击