C语言中的二级指针(双指针)

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

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

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

错误代码如下:

一级指针

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

输出的结构如下:


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

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

[cpp] view plaincopyprint?
  1. void swap(TYPE *a,TYPE *b)  
  2. {  
  3.         TYPE tmp;  
  4.         tmp=*a;  
  5.         *a=*b;  
  6.         *b=tmp;  
  7. }  



二级指针

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

[cpp] view plaincopyprint?
  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. }  


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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试环境服务器硬盘塞满问题排查

项目中出现的问题 某天下午测试环境服务器出现tab无法补全命令&#xff0c;给出的提示大概意思就是说,无可用空间无法创建临时文件&#xff0c;不过这次跟上次出现的问题比较像&#xff0c;上次服务器出现的问题&#xff0c;因此楼主判断可能是服务器数据盘被占满&#xff0c;果…

alpine_glibc 构建sun jdk 8的docker镜像

2019独角兽企业重金招聘Python工程师标准>>> 构建系统基础镜像 alpine glibc 的Dockerfile内容如下&#xff1a; alpine:3.6 MAINTAINER tongqiang<tongqiangyingmail.com># Here we install GNU libc (aka glibc) and set C.UTF-8 locale as default.ENV ALP…

单工 半双工 全双工

1 单工 单工就是指A只能发信号&#xff0c;而B只能接收信号&#xff0c;通信是单向的&#xff0c;就象灯塔之于航船——灯塔发出光信号而航船只能接收信号以确保自己行驶在正确的航线上。 2 半双工 半双工就是指A能发信号给B&#xff0c;B也能发信号给A&#xff0c;但这两…

c语言两个循环的ys,c语言编程:从键盘输入两个数,求它们的最小公倍数

满意答案flywisdom2019.06.20采纳率&#xff1a;44% 等级&#xff1a;9已帮助&#xff1a;1064人main(){int p,r,n,m,temp;printf("Please enter 2 numbers n,m:");scanf("%d,%d",&n,&m);//输入两个正整数.if(n{tempn;nm;mtemp;}pn*m;//P是原来…

每日微软面试题

每日微软面试题——day 1 <以下微软面试题全来自网络> <以下答案与分析纯属个人观点&#xff0c;不足之处&#xff0c;还望不吝指出^_^> 题&#xff1a;.编写反转字符串的程序&#xff0c;要求优化速度、优化空间。 分析&#xff1a;构建两个迭代器p 和 q &…

第八章 多态

第八章 多态1. 重写一个类通过继承来产生一个新类&#xff0c;继承了父类的所有变量和方法&#xff0c;在继承这些变量和方法的时候&#xff0c;子类也可以具有自己独特的特征和行为。Public class fruit{Public void print(){System.out.println(“这是超类的方法”);}}Clas…

Ionic Angular自动捕获错误 配置Angular2.x +

配置app.module.ts import { Pro } from ionic/pro;// These are the imports required for the code below, // feel free to merge into existing imports. import { Injectable, Injector } from angular/core; import { IonicErrorHandler } from ionic-angular;const Ioni…

信道和物理媒体的区别

一个信道可以包含很多的物理媒体吗&#xff0c;同时一个物理媒体也可以包含很多的信道。 信道借助于物理媒体实现数据传输&#xff0c;在比较远的数据传输过程中可能会使用多个不同的物理媒体实现数据的传输。 而一个物理媒体也可以借助于多路复用技术实现多条信道

c语言删除尾部空格函数,新人提问:如何将输出时每行最后一个空格删除

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼如何将每行最后一个空格删除&#xff0c;使矩阵只有数字间有空格&#xff0c;没有多余空格&#xff1f;#include#includeint main(){int i,j,k,m,n,x,h,y;int a[15][15]{0};while(scanf("%d",&i)){k1;for(n1;n<i;…

jsonArray与 jsonObject区别与js取值

一、JSONObject和JSONArray的数据表示形式 JSONObject的数据是用 { } 来表示的&#xff0c; 例如&#xff1a; { "id" : "123", "courseID" : "huangt-test", "title" : "提交作业", "content" : nu…

计划任务 at,cron

示例&#xff1a;每3小时echo和wall命令 转载于:https://www.cnblogs.com/momenglin/p/8551618.html

代码疑云

代码疑云(1)-掌握初始化列表 代码&#xff1a; [cpp] view plaincopy#include<iostream> using namespace std; class A { private: int x1; int x2; public: A():x2(1),x1(x2){} //初始化列表 void print() { cout<<"x1"<&…

网络拥塞

拥塞&#xff08;Congestion&#xff09;指的是在包交换网络中由于传送的包数目太多&#xff0c;而存贮转发节点的资源有限而造成网络传输性能下降的情况。拥塞的一种极端情况是死锁&#xff08;Deadlock&#xff09;&#xff0c;退出死锁往往需要网络复位操作。

android 多线程future,多线程FutureTask的使用方法和使用实例

FutureTask是一种可以取消的异步的计算任务。它的计算是通过Callable实现的&#xff0c;它等价于可以携带结果的Runnable&#xff0c;并且有三个状态&#xff1a;等待、运行和完成。完成包括所有计算以任意的方式结束&#xff0c;包括正常结束、取消和异常。Future有个get方法而…

2017.12.26

转载于:https://www.cnblogs.com/dyh-air/p/8118961.html

mac 下安装pip

pip是常用的python包管理工具&#xff0c;类似于java的maven。用python的同学&#xff0c;都离不开pip。 在新mac中想用home-brew安装pip时&#xff0c;遇到了一些小问题&#xff1a; bogon:~ wanglei$ brew install pip Error: No available formula with the name "pip&…

IT职场人生系列

IT职场人生系列之一&#xff1a;序言及找谁占卜 本文是IT职场人生系列的第一篇。 时间流逝&#xff0c;渐渐从之前在公司里边的小弟变成大哥了&#xff0c;当年身边比我大的程序员们都不见了&#xff0c;既没有当领导也没有去创业&#xff0c;就这么消失了。 年轻的程序员或…

RS-232协议

计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。由于串行通讯方式具有使用线路少、成本低&#xff0c;特别是在远程传输时&#xff0c;避免了多条线路特性的不一致而被广泛采用。 在串行通讯时&#xff0c;要求通讯双方都采用一个标准接口&am…

linux sed 找出前后三行,Linux Sed 使用示例

环境&#xff1a;CentOS鉴于语句描述苍白无力&#xff0c;用例子直接说明。mytxt文件内容&#xff1a;zilzhang 19881110 jiangxi 18 filmzhagnsan 21321 sichuan 100 cardlisi 3435 hunan 65 TV1. 找出文件第二行$ sed -n ‘2p‘ mytxtzhagnsan 21321 sichua…

MessageBox 弹框

模拟系统的消息提示框而实现的一套模态对话框组件&#xff0c;用于消息提示、确认消息和提交内容。 从场景上说&#xff0c;MessageBox 的作用是美化系统自带的 alert、confirm 和 prompt&#xff0c;因此适合展示较为简单的内容。如果需要弹出较为复杂的内容&#xff0c;请使用…