对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了。c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分。

指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据是地址。地址又是什么概念?每一段内存都有其相应的地址,用街道来比喻的话,地址就是门牌号,数据就储存在家里。指针变量的作用就是储存门牌号。

定义一个指针变量要加一个*号。这里要提及两个概念,指针的类型和指针指向的类型。首先来说一下指针的类型。一般来说,指针类型要与指针指向的类型相匹配,不匹配的话往往会有警告。但是指针类型可以不匹配指针指向的类型。指针类型可以是用原本存在的类型如int *,char *,也可以自己定义,如结构体指针等。我认为定义指针类型目的就是确定指针的步长,即对指针变量进行p++操作时,p的数据加了几个字节。如int *p进行p++时,p的数据加了四个字节(对于32位系统),因为int型占的内存就是4个字节。所以同样的,char *p进行p++操作时,p的数据加了一个字节。同样的,定义一个占20个字节的结构体stu,那么stu *p的p++里面数据增加20个字节。所以就可以用char *p来访问int类型中每一个字节的数据。程序和运行结果如下:

所以可以通过这样的方法来访问int定义的i中每一个字节所存储的内容,也可以通过这样的方法确定大小端。

接下来说一下指针指向的类型。指针的作用保存一段内存的地址,也就是指向这段内存。所以指针指向的类型就是指针变量保存的地址上的那段内存的类型。

实际上指针变量p也同样占有一段内存,因此指针变量p也有地址,可以定义一个指向指针的指针。如int *p1=NULL;int **p2=&p1;其中p2就是指向指针的指针。

还有一个需要注意的是指针变量的长度只和系统有关,32位系统中无论定义什么样类型的指针,指针变量所占的内存都是32位,也就是四个字节;64位系统的指针都是八个字节。定义指针类型的目的就是为了确定指针的步长,目的是为了更方便地读取数据。如定义一个int *p1=&a;char *p1=&a;这里面p1和p2所存的数据是相同的,p1和p2的所占用的内存也是相同的,但是进行p1++和p2++后,他们就相差3个字节,这就是步长的意义,也就是定义不同类型的指针变量的意义。下面举个栗子来说明一下:

最后来说一下关于指针的几种常见形式和意义

int *p=NULL  //定义一个指针变量p,类型为int *,该指针步长为4(因为对于32位系统来说,int型数据的占用内存是四个字节),指向的地址为空。一般定义一个指针如果不赋初值的话,为了安全要指针指向NULL。

p=&a  //将变量a的地址赋值给p。变量的本质是一段内存,内存都有地址。a是一个变量,也就是一段内存,所以有地址。

a=*p  //将p指向的内存的数据赋值给a。除了在定义时,*p的意义就是p指向的那段内存存的数据。

typedef struct stu{}*p_st;p_st p1;  //定义一个结构体变量p1,p1的步长为结构体所占的字节。

浅谈c语言的指针的更多相关文章

  1. 浅谈C语言 extern 指针与数组

    /* * d.c * * Created on: Nov 15, 2011 * Author: root */ #include "apue.h" int a[] = {3,2}; ...

  2. 浅谈C语言中的强符号、弱符号、强引用和弱引用

    摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...

  3. 浅谈Java语言环境搭建-JDK8

    title: 浅谈Java语言环境搭建-JDK8 blog: CSDN data: Java学习路线及视频 1.What's the JDK,JRE JDK(Java Development Kit ...

  4. 浅谈c语言结构体

    对于很多非计算机专业来说,c语言课程基本上指针都不怎么讲,更别说后面的结构体了.这造成很多学生对结构体的不熟悉.这里我就浅谈一下我对结构体的认识. 结构体,就是我们自己定义出一种新的类型,定义好之后, ...

  5. 浅谈C语言中断处理机制

    一.中断机制 1.实现中断响应和中断返回 当CPU收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急.更重要的工作,则在执行完当前指令后响应这一中断请求.CPU中断响应过程如下:首先, ...

  6. 浅谈C语言指针

    下面就几种情况讨论指针. 一.指针和变量 变量是存储空间的别名,访问形式是直接访问. 指针访问内存地址是间接访问. 使用指针访问内存的场合:1.局部变量,参数传递    2.动态分配内存 指针本身也是 ...

  7. 浅谈 C 语言中模块化设计的范式

    今天继续谈模块化的问题.这个想慢慢写成个系列,但是不一定连续写.基本是想起来了,就整理点思路出来.主要还是为以后集中整理做点铺垫. 我们都知道,层次分明的代码最容易维护.你可以轻易的换掉某个层次上的某 ...

  8. 浅谈C语言变量声明的解析

    C语言本身提供了一种不甚明确的变量声明方式——基于使用的声明,如int *a,本质上是声明了*a的类型为int,所以得到了a的类型为指向int的指针.对于简单类型,这样声明并不会对代码产生多大的阅读障 ...

  9. 浅谈C++的this指针

    之所以写这篇文章,主要是为了回答网友 zhancaihua123同学的下面几个问题: father* p=new son;p->disp(...);father是父类,son是子类.disp是一 ...

随机推荐

  1. pyqt4学习笔记

    信号与槽机制 信号与槽机制作为Qt最重要的特性,提供了任意两个Qt对象之间的通信机制.其中,信号会在某个特定情况或动作下被触发,槽是用于接收并处理信号的函数.例如,要将一个窗口中的变化情况通知给另一个 ...

  2. javascript中利用柯里化函数实现bind方法

    柯理化函数思想:一个js预先处理的思想:利用函数执行可以形成一个不销毁的作用域的原理,把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函数中把之前预 ...

  3. 2014最后一天,好烦!这个问题从来没遇到过!网上查找了很多办法都没解决!并且no wifi 了!

    org.hibernate.NonUniqueObjectException: a different object with the same identifier value was alread ...

  4. js float 数据相加,有的正确,有的不对

    转:http://bbs.csdn.net/topics/360259080 //浮点数加法运算function FloatAdd(arg1,arg2){    var r1,r2,m;    try ...

  5. asp.net 一句话搞定分页

    rows 是客户端传过来的行数,page是页码,传参就需要就两个参数就行,sql语句中_row 和_page 自己声明的局部变量,值还是相应的row 和page ,为了运算而已. 用数据库类获得它的D ...

  6. typeof,GetType

    typeof: 是运算符,获得某一类型的 System.Type 对象. Int32 t = new Int32(); Type t = typeof(int); GetType: 是方法,获取当前实 ...

  7. eclipse遇到不会部署的情况

    1.先看下右下角有没有在进行的进程,例如validating  验证中.那就关闭验证的选项 2.看下problem栏有没有问题.会导致building不了.

  8. plsql dev

    访问v$session,v$sesstat and v$statname视图的权限 grant create session,resource to chf; grantselectonv_$sess ...

  9. MySQL ERROR 1005: Can't create table (errno: 150)的错误解决办法

    在mysql 中建立引用约束的时候会出现MySQL ERROR 1005: Can't create table (errno: 150)的错误信息结果是不能建立 引用约束. 出现问题的大致情况 1. ...

  10. guava学习--Objects

    转载:https://my.oschina.net/realfighter/blog/349821 Java中的Object类是所有Java类的超类(也就是祖先),所有对象都实现Object类中的方法 ...