玩转指针(Playing with Pointers)
Question: What is a Pointer? What are its limitations? What are its benefits? How do we use it? What all operation we can perform using it?
In this article we are going to discover answers to all these questions.
指针是一个包含其它变量地址的变量,这里的其它变量可以是结构,数组或则其它基本类型的数据。定义指针的基本语法如下:
Datatype * identifier;
Datatype表示定义的指针变量中存储的是何种类型数据的地址。
*是间接取值/解引用符号。
identifier是定义的指针变量名。
指针使得我们能直接对内存操作改变内存中存储的数据,这是C语言的特征。无论何时我们定义一个指向某种类型数据的指针,我们可以称呼这个指针为——例如整型数据——指向整型数据的指针。
在C语言中指针和数组的关系很密切。数组的下标形式可以用指针形式替代,一般指针形式比较快。因此,数组中arr[n]第i各元素可以用*(arr + i)表示。之所以能这样表示是因为数组名本身就是数组第一个元素的地址。但数组名和指针还是有很重要的区别的。指针是一个变量,
ptr=arr;
和
ptr++;
是合法的,但数组名不是变量,这样的语句:
arr=ptr;
和
arr++;
都是不合法的,这里arr和ptr的定义也是不同的,分别是int arr[n] 和 int *ptr。
指针操作
现在我们来看看指针相关的操作。可行的操作有:给指针指向的变量赋值,指针变量和指针变量的加减,指针和整数的加减,指针减指针,利用指针对数组元素进行加减和比较。所有其它指针本身的算术都是非法的,包括但不限于指针本身相加,乘除,平移或掩码操作,加减浮点数,不加转换的赋值等。然而,如果两个指针指向同一个数组的元素,可以使用二进制运算== , != , < , >=。
C语言中还定义了一个一般化的指针——void *,也就是空指针。它可以被投射成任何类型的指针,默认情况下返回类型是库函数malloc(),void *类型指针不能de-reference(取指针指向的值)自己,所以需要转化为其它类型的指针。下面的代码包含了所有我们讨论过的方面。
#include<stdio.h> int main(void)
{
// Declaring a void pointer
void *vptr; // Creating some pointer variables
int arr[5]={34,5,17,39,1};
int *ptr1,*ptr,num,i; vptr=arr; ptr=(int *)vptr; // casting void * ptr1=arr+3; // pointer and integer addition if(ptr1 > ptr) //comparison of pointers
num=ptr1-ptr; // subtraction of pointers printf("% d,% d,% d\n",*ptr,*ptr1,num); ptr = ptr1-2; //pointer and integer subtraction
ptr1++; //pointer increment printf("% d,% d\n",*ptr,*ptr1); return 0;
}
Output:
34 39 3
5 1
下面是一些非法的操作:
// invalid operations
ptr1 = arr + ptr ;
ptr1 +=ptr;
ptr *=3;
ptr1 /=ptr;
char *cptr =ptr;
ptr =*(arr +4.2);
ptr <<2;
这边文章给初学者介绍了指针的基本操作,多维指针和指向函数的指针我们以后会讨论到。
玩转指针(Playing with Pointers)的更多相关文章
- 关于KeilC51的指针(参见, page 106-113, keil uv2 user's guide 09,2001)
keil中的指针分为两种,一种是普通指针,兼容标准C语言的指针:另一种是我翻译成内存特殊指针(memory-specific pointers,翻译的不好:>) 一.普通指针 普通指针的定义方式 ...
- 智能指针 shared_ptr 解析
近期正在进行<Effective C++>的第二遍阅读,书里面多个条款涉及到了shared_ptr智能指针,介绍的太分散,学习起来麻烦.写篇blog整理一下. LinJM @HQU s ...
- 风险指针(Hazard Pointer) 内存空间共享模型
WiredTiger是一种高性能的开源存储引擎,现已在MongoDB中作为内模式应用.WiredTiger支持行存储.列存储两种存储模式,采用LSM Tree方式进行索引记录 WiredTiger支持 ...
- Swift中的指针类型
Swift编程语言为了能与Objective-C与C语言兼容,而引入了指针类型.尽管官方不建议频繁使用指针类型,但很多时候,使用指针能完成更多.更灵活的任务.比如,我们要实现一个交换两个整数值的函数的 ...
- C指针与二维数组
先贴上完整的代码: #include<stdio.h> int main(int argc, char *argv[]){ int a[3] [5]={1,2,3,4,5,6,7,8,9, ...
- 要让CLR挂掉的话……
http://rednaxelafx.iteye.com/blog/460893 (Disclaimer:如果需要转载请先与我联系. 作者:RednaxelaFX -> rednaxelafx. ...
- Java8 jvm参数
jmap输出 [tomcat@n01 ~]$ /opt/java/jdk1..0_101/bin/jmap -heap Attaching to process ID , please wait... ...
- 内存管理内幕mallco及free函数实现
原文:https://www.ibm.com/developerworks/cn/linux/l-memory/ 为什么必须管理内存 内存管理是计算机编程最为基本的领域之一.在很多脚本语言中,您不必担 ...
- Effective C++ 之 Item 2:尽量以 const, enum, inline 替换 #define
Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 2. 尽量以 const, enum, inline 替换 #d ...
随机推荐
- 使用带Arduino IDE & WIZ820io的ATmega1284P
使用带Arduino IDE & WIZ820io的ATmega1284P 2013/07/04 | Filed under: IO模块 and tagged with: arduin ...
- android repo库的创建及代码管理
- MySQL数据库的环境及简单操作
***********************************************声明*************************************************** ...
- C# 杨辉三角形算法
代码如下: static void Main(string[] args) { int[][] Array_int = new int[10][]; //向数组中记录杨辉三角形的值 for (int ...
- 递归生成树对象,应用于Easyui,Tree控件
1.生成树节点对象 /// <summary> /// 生成树的节点 /// </summary> public class TreeNode { public TreeNod ...
- JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)
JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference
- 浅谈MDX处理空值NULL及格式化结果
MDX查询结果中往往会含有"NULL"值,这是某维度下对应的的量值不存在导致的,为了让报表呈现更好的效果,在有些情况下,需要将"NULL"的切片值置换成0,这些 ...
- iOS_SN_LLDB常用命令
有一次因为封装一个控件,UI能正常显示就是不能点击,一点击就崩溃,而且异常断点也无法捕捉,把Xcode的僵尸对象打开,每次崩溃就打印一个地址,最后就必须根据地址寻找对象,可以使用frame varia ...
- C/C++中逗号表达式的用法
代码: #include <cstdio> #include <iostream> using namespace std; int main(){ int t1,t2; t1 ...
- MFC 创建选项卡
1.创建三个选项卡Dialog窗体,ID分别改为porpTest1.porpTest2.porpTest3 2.创建三个选项卡类,类名分别为CPropTest1.CPropTest2.CPropTes ...