对于非计算机专业的同学,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. P​D​F​二​次​开​发​_​i​S​t​y​l​e​P​D​F​表​单​域​的​填​充

    wo讲到PDF表单,我们首先需要认识Adobe定义的PDF表单有哪些.以下是我从网上搜索到的简单介绍: PDF 表单简介 PDF 是可移植文档格式(Portable Document Format)的 ...

  2. yii2 renderPartial

    在 views/news/_copyright.php 中插入以下代码: <div> This is text about copyright data for news items &l ...

  3. 关于margin的一些问题

    引 在平时处理样式的过程中,会出现各种问题.比如: 包含在父元素中的子元素设置了浮动,子元素高度变化的时候父元素的高度没有随着变化,就是没有被撑高,父元素仍然是原来设置的那个高度 包含在父元素中的子元 ...

  4. 为什么不要使用Response.Close()

    不要使用Response.Close()    不要使用Response.Close()    不要使用Response.Close()        1  因为:Close()方法会调用HttpWo ...

  5. 基础笔记3(二)(专门处理String的正则表达式)

    1.常规判断一个字符串是以什么开头,是否是数字的判断方式有: a.通过比较每个字符,注意比较是字符值(ASc码值),不是字面值 String s="); //判断每个字符数组的每个字符 ch ...

  6. GCD 开发

    一.简介 GCD 的全称是 Grand Centre Dispatch 是一个强大的任务编程管理工具.通过GCD你可以同步或者异步地执行block.function. 二.dispatch Queue ...

  7. jmx相关资料

    http://www.ibm.com/developerworks/cn/java/j-lo-jse63/ http://blog.csdn.net/javafreely/article/detail ...

  8. MySQL 语句使用到的关键字 函数 记录

    一   处理重复数据 1  使用 UNIQUE 唯一键 (添加数据) 创建表的时候设置 2 使用 DISTINCT (查询数据--过滤) eg:SELECT DISTINCT `name` from ...

  9. LD_LIBRARY_PATH的设定

    LD_LIBRARY_PATH的设定   变量LD_LIBRARY_PATH 是用来在Linux下设置动态链接库(*.so)的查找路径,我们一般情况下都需要在运行一个带有动态链接库的程序是运行 exp ...

  10. mybatis中 ${}和#取值小记(Parameter index out of range)

    mybatis mapperxml文件中有两种取值法.${}和#{} $的是原样,#的是取值并转成指定?#{ele1,jdbcType=VARCHAR} 有个坑, 错误的写法 <if test= ...