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. css中margin:0 auto没作用

    很多初学制作网页的朋友,可能会遇到的一个常见问题,就是在CSS中加了margin:0 auto;却没有效果,不能居中的问题!margin:0 auto;的意思就是:上下边界为0,左右根据宽度自适应!其 ...

  2. lesson5:Condition的原理分析及demo展示

    Condition 将 Object 监视器方法(wait,notify,和notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待 set(wa ...

  3. 【HPP开发】让所有中小企业拥有自己的APP

    HPP hybirdApp或者hbuilderApp, 指通过html,css,js语言开发出ios和android两个版本的APP, 开发效率成倍上升,开发时间大幅缩减,开发成本同样也大大缩减. 移 ...

  4. 魔方公式xyz

    x:(整个魔方以R的方向转动),x':(整个魔方以R'的方向转动)  y:(整个魔方以U的方向转动),y':(整个魔方以U'的方向转动)  z:(整个魔方以F的方向转动),z':(整个魔方以F'的方向 ...

  5. Codeforces 385C Bear and Prime Numbers

    题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...

  6. Android应用开发-小巫CSDN博客client之嵌入有米广告

    Android应用开发-小巫CSDN博客client之嵌入有米广告 上一篇博客给大家介绍怎样集成友盟社会化组件,本篇继续带来干货,教大家怎样嵌入广告到应用中去.小巫自称专业对接30年,熟悉各大渠道SD ...

  7. google login page

    </pre><pre name="code" class="html"><div class="container&qu ...

  8. C++类的const成员函数、默认的构造函数、复制形参调用函数(转)

    C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...

  9. somethings about QSplitter

    m_splitter = new QSplitter(Qt::Horizontal);    m_splitter->addWidget(this->m_leftWidget);    m ...

  10. ComboBox( 下拉列表框)

    一. 加载方式//class 加载方式<select id="box" class="easyui-combobox" name="box&qu ...