C语言中的二级指针(双指针)
二级指针又叫双指针。C语言中不存在引用,所以当你试图改变一个指针的值的时候必须使用二级指针。C++中可以使用引用类型来实现。
下面讲解C中的二级指针的使用方法。
例如我们使用指针来交换两个整型变量的值。
错误代码如下:
一级指针
- #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;
- }
#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位的整型变量,而是一个复杂的数据结构,这样做会降低效率。如下;
- void swap(TYPE *a,TYPE *b)
- {
- TYPE tmp;
- tmp=*a;
- *a=*b;
- *b=tmp;
- }
void swap(TYPE *a,TYPE *b)
{
TYPE tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
二级指针
下面是使用二级指针分配内存的例子
- #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;
- }
#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语言中的二级指针(双指针)的更多相关文章
- C语言中的函数指针
C语言中的函数指针 函数指针的概念: 函数指针是一个指向位于代码段的函数代码的指针. 函数指针的使用: #include<stdio.h> typedef struct (*fun_t ...
- 利用C语言中的函数指针实现c++中的虚函数
C语言中的函数指针 #include<stdio.h> int fun1(int a) { return a*a; } int fun2(int a) { return a*a*a; } ...
- windev中的内存机制及其与C语言中的内存指针相似性(一)
windev中的内存机制,是初入windev世界必须要越过的一道高山,以下我的理解和经验未必都对,如有错误或遗漏,以后再纠正或补充!另外,以下内容,咱先谈应用,再说对机制的认识和理解. 一.新建表单, ...
- 策略设计模式与c语言中的函数指针
在C语言中有一个非常重要的概念-函数指针,其最重要的功能是实现回调函数(指函数先在某处注册,而它将在稍后某个需要的时候被调用)在java语言中没有指针的概念,但是可以利用接口和指针实现类似的功能,具体 ...
- 1、C语言中的函数指针
一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...
- C++中的二级指针和指针引用函数传参
在函数的使用过程中,我们都明白传值和传引用会使实参的值发生改变.那么能够通过传指针改变指针所指向的地址吗? 在解决这个问题之前,也许我们应该先了解指针非常容易混淆的三个属性: ①.指针变量地址(&am ...
- C语言中函数和指针的參数传递
近期写二叉树的数据结构实验.想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下c语言中指针作为形參的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个 ...
- c语言中结构体指针
1.指向结构体的指针变量: C 语言中->是一个总体,它是用于指向结构体,如果我们在程序中定义了一个结构体,然后声明一个指针变量指向这个结构体.那么我们要用指针取出结构体中的数据.就要用到指向运 ...
- C语言中数组与指针的异同之处!你不知道的编程奥秘~
C语言的数组和指针一直是两个容易混淆的东西,当初在学习的时候,也许为了通过考试会对指针和数组的一些考点进行突击,但是很多极其细节的东西也许并不是那么清楚.本篇侧重点在于分析数组与指针的关系,什么时候数 ...
随机推荐
- 在项目中添加全局的 pch 文件
说明,本片博文仅仅是方便自己以后在添加 pch 文件的配置时候参照使用,担心一些配置的路径由于时间而遗忘. (1)建一个 pch 文件 注意下面要 在 Targets 后打上 对号 (2)对该文件进行 ...
- jq之鼠标事件
以防自己忘记,最重要的是hover效果的 鼠标事件是在用户移动鼠标光标或者使用任意鼠标键点击时触发的. (1):click事件:click事件于用户在元素敲击鼠标左键,并在相同元素上松开左键时触发 ...
- codeforces#536题解
CodeForces#536 A. Lunar New Year and Cross Counting Description: Lunar New Year is approaching, and ...
- JAVA实现DIJKSTRA算法
import java.util.Queue; import java.util.LinkedList; public class dijkstra{ public static void main( ...
- Git 移除某些文件
一.前言 在使用 Git 版本控制中,有些文件是不需要加入到版本控制中的.如 日志( log ).编译的文件.这些随时都在变的文件,使用用一个代码库的用户.只要稍稍修改一点,或者启动一下,就会变.容易 ...
- c# UserControl 如何在父窗口中显示Scroll
1. UserControl 不应该是Dock = Fill, 而应该使用 Anchor 2. 父窗口(或者父控件,或者容器)的AutoScroll = True 3.UserControl 加入容器 ...
- Ruby测试小代码[计算50以内的素数]
算法思想 判断某一个数,能不能被比他平方根小的素数整除. 首先看看代码 $arr = [] $arr[0] = 2 def add_prime(n) 3.step(n,2){|num| $arr &l ...
- [Xcode 实际操作]八、网络与多线程-(11)使用同步Post方式查询IP地址信息
目录:[Swift]Xcode实际操作 本文将演示如何通过Post请求,同步获取IP地址信息. 一旦发送同步请求,程序将停止用户交互,直至服务器返回数据. 在项目导航区,打开视图控制器的代码文件[Vi ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie常用方法
以下是在Servlet中操作Cookie时可使用的有用的方法列表 ● public void setDomain(String pattern) 该方法设置cookie适用的域,例如 itxdl.c ...
- 安装CocoaPods,ios的库安装工具
1.需要ruby环境,mac pro自带了 2.终端输入:sudo gem install cocoapods