关于二级指针
来源:互联网 发布:集散流程方案设计优化 编辑:程序博客网 时间: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 ** 的原因,只有这样才能取得上层函数参数的地址。
第一篇小分享,有什么问题可以及时评论。
- 关于二级指针
- 关于二级指针
- 关于二级指针
- 关于二级指针
- 关于二级指针
- 关于二级指针的理解
- 关于句柄和二级指针
- 关于一级指针和二级指针
- pthread_join多线程中关于一个二级指针
- 关于二级指针与c++中的引用
- 关于函数传值调用(二级指针)
- iOS 关于%p、二级指针及其应用
- 关于C的二级指针的问题
- 12-3-23关于一级指针,二级指针
- 关于一级指针和二级指针的简单见解
- 二级指针
- 二级指针
- 二级指针
- linux串口操作及设置
- 【Java并发编程】7、线程池
- 1996年分区联赛提高组之三 挖地雷 JudgeOnline 1071
- SSL握手过程
- Linux进程调度策略
- 关于二级指针
- altium designer绘制 pcb时怎么隐藏其中网络提示线
- JavaScript MVC框架PK:Angular、Backbone、CanJS与Ember
- 【杭电OJ】3790--最短路径(dijkstra)
- 排序篇(7)--快速排序
- [IOS APP]走遍美国-英语听力有声版
- java23种设计模式 代理模式(五)
- “玲珑杯”Round #11
- 基于LR的新闻多分类(基于spark2.1.0, 附完整代码)