对于非计算机专业的同学,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. 用SignalR实现的弹幕功能

    弹幕功能通常用于实时显示当前视频或者文档的评论内容,在上快速飞过的方式呈现,看起来比较酷炫. 这种典型的多用户实时交互的功能,很适合使用SignalR实现,通过SignalR提供后台的服务推送功能,客 ...

  2. 有关宏定义的bug

    #define max(a,b) a>b?a:b 这个宏有诸多缺点:当调用比如max(3,2)*2时会出现不想要的结果.按理来说,我们想要得到的结果是:3*2=6,但是由于优先级的问题,得到的结 ...

  3. HTML5 十大新特性(五)——SVG绘图

    相对于canvas绘图,SVG是一种绘制矢量图的技术.全称叫做Scalable Vector Graphics,可缩放的矢量图,在2000年就已经存在,H5把它纳入了标准标签库,并进行了一些瘦身.需要 ...

  4. Address already in use: JVM_Bind:8080 的解决办法<转>

    出错情况:运行 Tomcat 时报错 含义:8080 位置显示的端口被其他进程占用 解决方法: 方法1: 开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID ...

  5. centos7 升级内核到最新版本

    centos7 从问世以来,官网提供的镜像始终是3.10 版本,该版本最大的一个问题是对硬件驱动(尤其是无线网卡)的支持不是很好,本人亲测>5种机型,无线网卡均无法正常使用,如果是非主流机型,手 ...

  6. JSON数据源提供多值参数的实现

    一.应用场景 (1)报表的数据内容需要根据某个参数进行过滤. (2)该参数是一个多值参数,即从一个下拉列表中选择一个或多个项目. (3)报表需要自动运行,因此参数必须有默认值. (4)参数默认值无法在 ...

  7. java中的成员变量和局部变量区别

    1.作用域不同 成员变量的作用域在整个类内部都是可见,可用的: 局部变量的作用域仅限于定义它的方法,不能被其它方法调用: 2.初始值不同 java会给成员变量一个初始值,初始值为0: java不会给局 ...

  8. 第一种SUSE Linux IP设置方法

    第一种SUSE Linux IP设置方法ifconfig eth0 192.168.1.22 netmask 255.255.255.0 uproute add default gw 192.168. ...

  9. LR手动关联新手总结

    最近学习LoadRunner的时候深刻体会:新手入门真心不容易啊 今天一直在纠结LoadRunner的手动关联问题,之前刚开始看书的时候就看到了,不过当时想先放放,后面来细细研究, 今天看的时候在网上 ...

  10. blade and soul pvp guide

    PvP PvP in Blade and Soul is categorized into two types, a personal PvP called Arena and a large-sca ...