二级指针
2016-02-28 21:20
363 查看
http://www.fenesky.com/blog/2014/07/03/pointers-to-pointers.html
1 #include <unistd.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 void increase(int* ptr) 5 { 6 *ptr = *ptr + 1; 7 ptr = NULL; 8 } 9 10 int main(int argc, char** argv) 11 { 12 int count = 7; 13 int* countPtr = &count; 14 increase(countPtr); 15 printf("count = %d\n", count); 16 printf("countPtr = %p\n", countPtr); 17 return 0; 18 }
运行结果,count = 8,而countPtr则不是NULL。
运用前面的理论,其实很容易分析出问题。一级指针变量,也是一个普通变量,只不过这变量的值是一个内存单元的地址而已。countPtr在传递给increase之前,被copy到一个临时变量中,这个临时变量的值是一个地址,可以改变这个地址所在内存单元的值,但是无法改变外部的countPtr。
从这个结果可以得出一个结论:一级指针作为参数传递,可以改变外部变量的值,即一级指针所指向的内容,但是却无法改变指针本身(如countPtr)。
有了上面的理解基础,其实对于理解二级指针已经很容易了。
对于指针操作,有两个概念:
引用:对应于C语言中的&取地址操作
Reference
解引用:在C语言中,对应于->操作。
Dereference operator
对于一个普通变量,引用操作,得到的是一级指针。一级指针传递到函数内部,虽然这个一级指针的值会copy一份到临时变量,但是这个临时变量的内容是一个指针,通过->解引用一个地址可以修改该地址所指向的内存单元的值。
对于一个一级指针,引用操作,得到一个二级指针。相反,对于一个二级指针解引用得到一级指针,对于一个一级指针解引用得到原始变量。一级指针和二级指针的值都是指向一个内存单元,一级指针指向的内存单元存放的是源变量的值,二级指针指向的内存单元存放的是一级指针的地址。
二级指针一般用在需要修改函数外部指针的情况。因为函数外部的指针变量,只有通过二级指针解引用得到外部指针变量在内存单元的地址,修改这个地址所指向的内容即可。
我们针对上面的代码继续做修改
1 #include <unistd.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 void increase(int** ptr) 5 { 6 **ptr = **ptr + 1; 7 *ptr = NULL; 8 } 9 10 int main(int argc, char** argv) 11 { 12 int count = 7; 13 int* countPtr = &count; 14 increase(&countPtr); 15 16 printf("count = %d\n", count); 17 printf("countPtr = %p\n", countPtr); 18 return 0; 19 }
这段代码,运行结果count = 8, countPtr = NULL;
总结
首先,指针变量,它也是一个变量,在内存单元中也要占用内存空间。一级指针变量指向的内容是普通变量的值,二级指针变量指向的内容是一级指针变量的地址。相关文章推荐
- 2.3 写入AVI视频文件
- LNMP环境搭建
- UVA12563 Jin Ge Jin Qu hao(背包问题)
- Data Structures And Problem Solving Using Java (Fourth Edition)中译版(Java 修饰词与可见性)
- ionic css布局之bar页眉页脚定义
- 计算机网络学习笔记----互联网分层及协议
- POJ 3122 pie 二分
- 5.1数组(一维部分)
- const形参与非const形参
- CSS——div居中,window.open(0
- HTML窗体指南
- Java自定义比较器实现中文排序
- 【SSME】java.lang.IllegalStateException: Failed to load ApplicationContext
- Redis3.0与Jedis2.7.2 客户端与Spring整合
- 《编写高质量代码:改善C++程序的150个建议》读书笔记2
- LeetCode 26: Remove Duplicates from Sorted Array
- 找出数组中的最小值--递归实现
- js中object的申明方法
- 无线轮播
- HDU 1405 The Last Practice