原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/7220688
C语言更多查看

二级指针又叫双指针。C语言中不存在引用,所以当你试图改变一个指针的值的时候必须使用二级指针。C++中可以使用引用类型来实现。

下面讲解C中的二级指针的使用方法。

例如我们使用指针来交换两个整型变量的值。

错误代码如下:

一级指针

  1. #include <stdio.h>
  2. void swap(int *a,int *b)
  3. {
  4. int *tmp=NULL;
  5. tmp=a;
  6. a=b;
  7. b=tmp;
  8. }
  9. int main(int argc,char **argv)
  10. {
  11. int a=2;
  12. int b=3;
  13. printf("Before swap a=%d  b=%d\n",a,b);
  14. swap(&a,&b);
  15. printf("After swap a=%d  b=%d\n",a,b);
  16. return 0;
  17. }
#include <stdio.h>

void swap(int *a,int *b)
{
int *tmp=NULL;
tmp=a;
a=b;
b=tmp;
} int main(int argc,char **argv)
{
int a=2;
int b=3;
printf("Before swap a=%d b=%d\n",a,b);
swap(&a,&b);
printf("After swap a=%d b=%d\n",a,b);
return 0;
}

输出的结构如下:

结果分析:不论是数值还是指针,swap函数中的参数传递的是总是值,所以在上述函数中即使a和b的地址已参数传递给swap函数,而在函数内交换的是a和b的值(main函数中a的地址和b的地址),而交换完毕,函数相应的参数从栈中弹出,并不能返回给调用函数,所以该swap函数中的操作是徒劳。

这里完全可以直接交换a和b的值,不过如果a和b不是一个32位的整型变量,而是一个复杂的数据结构,这样做会降低效率。如下;

  1. void swap(TYPE *a,TYPE *b)
  2. {
  3. TYPE tmp;
  4. tmp=*a;
  5. *a=*b;
  6. *b=tmp;
  7. }
void swap(TYPE *a,TYPE *b)
{
TYPE tmp;
tmp=*a;
*a=*b;
*b=tmp;
}

二级指针

下面是使用二级指针分配内存的例子

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void memorylocate(char **ptr)
  5. {
  6. *ptr=(char *)malloc(10*sizeof(char));
  7. }
  8. int main(int argc,char **argv)
  9. {
  10. char *buffer;
  11. memorylocate(&buffer);
  12. strcpy(buffer,"12345");
  13. printf("buffer %s\n",buffer);
  14. return 0;
  15. }
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void memorylocate(char **ptr)
{
*ptr=(char *)malloc(10*sizeof(char));
}
int main(int argc,char **argv)
{
char *buffer;
memorylocate(&buffer);
strcpy(buffer,"12345");
printf("buffer %s\n",buffer);
return 0;
}

当想改变指针的值的时候不妨考虑使用二维指针。

C语言中的二级指针(双指针)的更多相关文章

  1. C语言中的函数指针

    C语言中的函数指针 函数指针的概念:   函数指针是一个指向位于代码段的函数代码的指针. 函数指针的使用: #include<stdio.h> typedef struct (*fun_t ...

  2. 利用C语言中的函数指针实现c++中的虚函数

    C语言中的函数指针 #include<stdio.h> int fun1(int a) { return a*a; } int fun2(int a) { return a*a*a; } ...

  3. windev中的内存机制及其与C语言中的内存指针相似性(一)

    windev中的内存机制,是初入windev世界必须要越过的一道高山,以下我的理解和经验未必都对,如有错误或遗漏,以后再纠正或补充!另外,以下内容,咱先谈应用,再说对机制的认识和理解. 一.新建表单, ...

  4. 策略设计模式与c语言中的函数指针

    在C语言中有一个非常重要的概念-函数指针,其最重要的功能是实现回调函数(指函数先在某处注册,而它将在稍后某个需要的时候被调用)在java语言中没有指针的概念,但是可以利用接口和指针实现类似的功能,具体 ...

  5. 1、C语言中的函数指针

    一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...

  6. C++中的二级指针和指针引用函数传参

    在函数的使用过程中,我们都明白传值和传引用会使实参的值发生改变.那么能够通过传指针改变指针所指向的地址吗? 在解决这个问题之前,也许我们应该先了解指针非常容易混淆的三个属性: ①.指针变量地址(&am ...

  7. C语言中函数和指针的參数传递

    近期写二叉树的数据结构实验.想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下c语言中指针作为形參的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个 ...

  8. c语言中结构体指针

    1.指向结构体的指针变量: C 语言中->是一个总体,它是用于指向结构体,如果我们在程序中定义了一个结构体,然后声明一个指针变量指向这个结构体.那么我们要用指针取出结构体中的数据.就要用到指向运 ...

  9. C语言中数组与指针的异同之处!你不知道的编程奥秘~

    C语言的数组和指针一直是两个容易混淆的东西,当初在学习的时候,也许为了通过考试会对指针和数组的一些考点进行突击,但是很多极其细节的东西也许并不是那么清楚.本篇侧重点在于分析数组与指针的关系,什么时候数 ...

随机推荐

  1. 通过上一节部署出来的 Windows instance 有时候会发现操作系统时间总是慢 8 个小时,即使手工调整好时间和时区,下次 instance 重启后又会差 8 个小时

    这是 OpenStack 实施经验分享系列的第 3 篇. 问题描述 通过上一节部署出来的 Windows instance 有时候会发现操作系统时间总是慢 8 个小时,即使手工调整好时间和时区,下次 ...

  2. json对象和json数组

    json字符串对象和json字符串数组:JSONArray跟JSONObject的区别就是JSONArray比JSONObject多中括号[] jsonObject: "Row": ...

  3. B - Alyona and Mex

    Description Someone gave Alyona an array containing n positive integers a1, a2, ..., an. In one oper ...

  4. 第三篇:SpringBoot用JdbcTemplates访问Mysql

    本文介绍springboot通过jdbc访问关系型mysql,通过spring的JdbcTemplate去访问. 准备工作 jdk 1.8 maven 3.0 idea mysql 初始化mysql: ...

  5. 技术胖Flutter第四季-24Flutter的打包

    视频地址: https://www.bilibili.com/video/av35800108/?p=25 文章地址: https://jspang.com/post/flutter4.html#to ...

  6. Flutter实战视频-移动电商-14.首页_url_launcher一键拨打店长电话

    14.首页_url_launcher一键拨打店长电话 首页拨打电话的功能. 接收连个值,一个是店长的头像,一个是电话号码, 然后开始写我们的build方法.点击图片的时候要有一个拨打电话的动作.我们要 ...

  7. Winform禁止程序多开 &&禁止多开且第二次激活第一次窗口

    一.禁止多开问题,运用Mutex锁 在Program.cs中运用Mutex锁 bool createNew;using (System.Threading.Mutex mutex = new Syst ...

  8. Lightoj1018 【状压DP】

    题意: 给你一个坐标系,坐标系上有N个点,然后让你用最少的线,把这些点全部连起来: 思路: (1+15)*15/2=90条线: 然后线上有哪些点就可以知道: 然后按照线上点的个数排序,然后删掉这个线, ...

  9. MecanimControl插件随笔

    ----------------------------------------- 4个animatorController是怎么回事? 分别对应 1镜像动画速度>0 2镜像播放速度<0 ...

  10. MongoDb 安装服务 以及 安全配置

    安装MongoDb 的服务 命令如下: (cmd以管理员运行) mongod –logpath "D:\Program Files\mongodb\data\logs.txt" – ...