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)的更多相关文章

  1. 关于KeilC51的指针(参见, page 106-113, keil uv2 user's guide 09,2001)

    keil中的指针分为两种,一种是普通指针,兼容标准C语言的指针:另一种是我翻译成内存特殊指针(memory-specific pointers,翻译的不好:>) 一.普通指针 普通指针的定义方式 ...

  2. 智能指针 shared_ptr 解析

    近期正在进行<Effective C++>的第二遍阅读,书里面多个条款涉及到了shared_ptr智能指针,介绍的太分散,学习起来麻烦.写篇blog整理一下. LinJM   @HQU s ...

  3. 风险指针(Hazard Pointer) 内存空间共享模型

    WiredTiger是一种高性能的开源存储引擎,现已在MongoDB中作为内模式应用.WiredTiger支持行存储.列存储两种存储模式,采用LSM Tree方式进行索引记录 WiredTiger支持 ...

  4. Swift中的指针类型

    Swift编程语言为了能与Objective-C与C语言兼容,而引入了指针类型.尽管官方不建议频繁使用指针类型,但很多时候,使用指针能完成更多.更灵活的任务.比如,我们要实现一个交换两个整数值的函数的 ...

  5. C指针与二维数组

    先贴上完整的代码: #include<stdio.h> int main(int argc, char *argv[]){ int a[3] [5]={1,2,3,4,5,6,7,8,9, ...

  6. 要让CLR挂掉的话……

    http://rednaxelafx.iteye.com/blog/460893 (Disclaimer:如果需要转载请先与我联系. 作者:RednaxelaFX -> rednaxelafx. ...

  7. Java8 jvm参数

    jmap输出 [tomcat@n01 ~]$ /opt/java/jdk1..0_101/bin/jmap -heap Attaching to process ID , please wait... ...

  8. 内存管理内幕mallco及free函数实现

    原文:https://www.ibm.com/developerworks/cn/linux/l-memory/ 为什么必须管理内存 内存管理是计算机编程最为基本的领域之一.在很多脚本语言中,您不必担 ...

  9. Effective C++ 之 Item 2:尽量以 const, enum, inline 替换 #define

    Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 2. 尽量以 const, enum, inline 替换 #d ...

随机推荐

  1. 性能优化之NSDateFormatter

    为什么要优化NSDateFormatter? 优化方式有哪些? 为什么要优化NSDateFormatter? 首先,过度的创建NSDateFormatter用于NSDate与NSString之间转换, ...

  2. CMA连续物理内存用户空间映射---(一)

    背景: 在多媒体和图像处理等应用中,经经常使用到大块内存,尤其是硬件编解码.须要内核分配大块的物理连续内存. 这里希望通过把从内核分配的连续物理内存映射到用户空间.在用户空间经过处理,又能够入队到驱动 ...

  3. python数据库做成邮箱的注册系统!

    #! /usr/bin/env python2.7 # -*- coding:utf-8 -*- #File:w7.py #Date:2013-7-18 #Author:wangyu import r ...

  4. ARM Cortex-M

    振荡周期.时钟周期.机器周期.指令周期 一个机器周期包含12个振荡周期或6个时钟周期 指令的执行时间称作指令周期(单.双.四周期) (1)振荡周期       振荡周期指为单片机提供定时信号的振荡源的 ...

  5. django: template using & debug

    模板的作用方法有如下三种: blog/views.py: from django.template import loader, Context, Template from django.http ...

  6. Java NIO框架Netty教程(一) – Hello Netty

    先啰嗦两句,如果你还不知道Netty是做什么的能做什么.那可以先简单的搜索了解一下.我只能说Netty是一个NIO的框架,可以用于开发分布式的Java程序.具体能做什么,各位可以尽量发挥想象.技术,是 ...

  7. 后台的Activity被系统回收怎么办?

    onSaveIntanceState,当程序中的某个Activity A在运行中,主动或者被动的运行另外一个新的Activity B,这个时候 A就会执行onSaveIntanceState(Bund ...

  8. shell获取文件行数

    获取文件行数: echo `cat $file | wc -l` 获取文件中不重复的行数(去重后) echo `awk '{$1="";print $0;}' $file_tel ...

  9. Swift 流程控制

    import Foundation ...{ == { print(index) } } // 可选变量 类型后面加? var myName:String?="jikexueyuan&quo ...

  10. Oracle—用户管理的备份(一)

    用户管理的备份(一) 一.首先要知道数据库中表空间和文件的信息,有几个性能视图,v$datafile,v$tablespace,v$tempfile,v$logfile,v$controlfile,d ...