首页 > 一级指针和二级指以及(void**)在双链表中的应用

一级指针和二级指以及(void**)在双链表中的应用

因为函数参数是按值传递的,所以要想改变变量,必须传递地址

二级指针实际上就是指针变量的地址,如果传递二级指针,函数声明必须写**

(void**)&必须是本质上就是指针变量的地址才可以做这样的转换并不是说把一个一级指针也可以转换void**的本质是标识一个二级指针。

&data就是(默认数据类型 **)&data,(void **)&data和&data还是同一块内存,只不过数据类型发生变化了。

如果默认数据类型是int,&data就是(int **)&data





一级指针:

  1. void
  2. swap ( int *a, int *b ){
  3. int temp = 0;
  4. temp = *a;
  5. *a = *b;
  6. *b = temp;
  7. }
  8. int
  9. main ( int argc, char **argv ){
  10. int a,b;
  11. a = 16;
  12. b = 32;
  13. swap(&a, &b);
  14. return ( a - b );
  15. }


二级指针:

  1. void swap(int **a, int **b)
  2. {
  3. int t;
  4. t =**a;
  5. **a =**b;
  6. **b=t;
  7. }
  8. int main()
  9. {
  10. int i = 3;
  11. int j = 5;
  12. int *p = &i;
  13. int *q = &j;
  14. swap(&p, &q);
  15. }




高级一点使用void**只是为了通用,可以交换各种类型。

  1. void swap(void **a, void **b)
  2. {
  3. void *t;
  4. t =*a;
  5. *a =*b;
  6. *b=t;
  7. }
  8. int main()
  9. {
  10. int i = 3;
  11. int j = 5;
  12. int *p = &i;
  13. int *q = &j;
  14. char *s1="abc";
  15. char *s2="def";
  16. swap((void**)&p, (void**)&q);
  17. swap((void**)&s1, (void**)&s2);
  18. }




注意char*是字符串指针,需要改变其对应的变量必须用地址,s1就是"abc"的起始地址,是不能被改变,要想改变s1必须用他的地址也就是&s1,所以需要void**:

  1. void swap(void *a, void *b)
  2. {
  3. void *t;
  4. t =a;
  5. a =b;
  6. b=t;
  7. }
  8. int main()
  9. {
  10. char *s1="abc";
  11. char *s2="def";
  12. swap((void*)s1, (void*)s2);
  13. }








(void**)& 本质

在看《算法精解  C语言描述》的双链表dlist.c的代码看到这样一段



算法精解:C语言描述examples_unixexampleschtblex-1.c

  1. int                *data;
  2. *data = 11;
  3. if (dlist_remove(&list, element, (void **)&data) != 0)
  4. return 1;



算法精解:C语言描述examples_unixsourcedlist.c

  1. int dlist_remove(DList *list, DListElmt *element, void **data) {
  2. /*****************************************************************************
  3. * *
  4. * Do not allow a NULL element or removal from an empty list. *
  5. * *
  6. *****************************************************************************/
  7. if (element == NULL || dlist_size(list) == 0)
  8. return -1;
  9. /*****************************************************************************
  10. * *
  11. * Remove the element from the list. *
  12. * *
  13. *****************************************************************************/
  14. *data = element->data;
  15. if (element == list->head) {
  16. /**************************************************************************
  17. * *
  18. * Handle removal from the head of the list. *
  19. 更多相关:

    • 文章目录1. 解决问题2. 应用场景3. 实现如下:C++实现C语言实现4. 缺点 1. 解决问题 在工厂方法模式中,我们卖衣服。此时我们为每一种衣服创建不同的工厂,帽子有一个工厂专门创建,裤子有一个工厂专门创建,T恤有一个工厂专门创建。这样的方式保证了代码设计的开闭原则(对扩展开发,对修改关闭),解决了简单工厂模式中暴露的...

    • 转载于:http://blog.csdn.net/u012819339/article/details/50654764   实体作品请参看优酷视频。 若以上链接点击无效请把该链接地址复制到浏览器地址栏 http://v.youku.com/v_show/id_XODYzODczNzQ4.html 说明: 该作品为arvik于2014...

    • - (void)viewDidLoad {[super viewDidLoad];NSLog(@"我在玩手机");NSLog(@"手机没电了");[self chargeMyIphone:^{NSLog(@"出门逛街");}];NSLog(@"我在看电视"); }-(void)chargeMyIphone:(void(^)(void...

    • http://stackoverflow.com/questions/150446/how-do-i-detect-when-someone-shakes-an-iphone 我的实现(基于Eran Talmor): 没必要application.applicationSupportsShakeToEdit = YES; Set th...

    •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

    • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

    • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

    • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

    • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

    • 学习计划 MyPlan11 主题:Python描述统计、简单统计图形 时间:8.5-8.11周内完成 参考资料:新书《谁说菜鸟不会数据分析python篇》 各位星友们,在这个星球里每个人都要逼迫自己学习未知的领域或知识点,每天进步一点点,积累的时间久了 ,菜鸟也能起飞。 完成情况: 在pandas中,使用describe函数进行描述统...

    • 利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信。 首先,先了解下SocketServer模块中可供使用的类: BaseServer:包含服务器的核心功能与混合(mix-in)类挂钩;这个类只用于派生,所以不会生成这个类的实例;可以考虑使用TCPServer和UDPServer。 TCPServer/UDPS...

    • 题目:序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。 示例:  你可以将以下二叉树:     1    /   2   3      /     4   5 序列化为 "[1,2,3,null,null,4,5]" 解题: /*** Definition for a binary tree no...

    • sd.js  import $global from "./global"; import $g from "./sg"; import $ from "jquery"; import {Message, Loading} from "element-ui";//引入饿了么相关组件 import {Base64} from "js-...

    •     原生sd.js----------------------------------------------------------------  const API_ROOT_URL = "http://www.api.com";const $d= {_postList_url: API_ROOT_URL + "/api...