在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)【用来指向该内存地址所对应的变量或数组】。指针一般出现在比较接近机器语言的语言,如汇编语言或C语言。面向对象的语言如Java一般避免用指针。指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的函数的值

本文侧重于通过几个例子,来解析指针。

数组和指针

1、

  1. int a[]={,,,,};
  2. int *p=(int*)(&a+);
  3. printf("%d\n",*(p-));
  1. /*
  2. a是一个数组名,也就是数组的首地址。
  3. 对a进行取地址运算符,得到的是一个指向数组的指针!!!!这句话尤为重要!
  4. 也就相当于
  5. int (*p) [5] = &a;
  6.  
  7. p=&a+1指向的是数组组a[4]的后面一个int单元,
  8. p-1指向a[4]=5
  9.  
  10. p是一个指针,它指向的是一个包含5个int元素的数组!!
  11. 那么执行p+1后,p的偏移量相当于 p + sizeof(int) * 5 !!
  12. 而程序中强制将指针p转换成一个int* 那么 p -1 其实就是 p - sizeof(int)
  13. 所以,p -1 指向了数组中得最后一个元素,也就是 5
  14. */

2、

  1. int a[]={,,,,};
  2. int*p[]={a,a+,a+,a+};
  3. int **q=p;
  4. printf("%d\n",*(p[]+)+**(q+));
  1. /*
  2. p[0]+1=a+1;
  3. *(p[0]+1)=2;
  4. *(q+2)=a+2;
  5. *(a+2)=3;
  6. 3+2=5;
  7.  
  8. 其中p[0]=a也就是a[0]的地址,
  9. p[0]+1=a+1就是a[1]的地址,
  10. *(p[0]+1)就是a[1]的值就是2,
  11. **q=p --> *q=&p -->表示q保存的是p 的地址,q+2表示p[2]的地址,*(q+2)表示p[2],
  12. **(q+2)表示*p[2]表示*(a+2)就是a[2]的值就是3,
  13. 所以
  14. *(p[0]+1)+**(q+2)=5
  15. */

3、

  1. int a[][]={,,,,,,,,,,,};
  2. int (*pt)[]=a;
  3. printf("%d\n",(*(pt+))[]);
  1. /*
  2. 二维数组a[3][4]可以看做是{{1,2,3,4},{5,6,7,8},{9,10,11,12}};
  3. (*(pt+2))[2]的值相当于 *(*(pt+2)+2)
  4. p[2]指向a[2]也就是a[2][0]的地址,所以p[2]+2指向a[2][2]的地址,其内容为11。
  5. */

4、

  1. int a[][]={,,,,};
  2. int *p[];
  3. p[]=a[];
  4. printf("%d\n",*(p[]+));
  1. // *(p[0]+1)所代表的数组元素是 a[1][1]

5、

  1. static int a[]={,,,,};
  2. int *p[]={a+,a+,a+,a};
  3. int **q=p;
  4. printf("%d\n",*(p[]+)+**(q+));
  1. /*
  2. *(p[0] +1 ) = *( *(p+0) + 1) = *(a+3 +1) = a[4] = 1
  3. **(q+2) = *(*(q+2) +0 ) =*( p[2]) = *(a+1) = 4;
          
  4. */

6、

  1. int a[]={,,,,,,,,,};
  2. int *p=&a[];
  3. int b=p[];
  4. printf("%d\n",b);
  1. /*
  2. a可以理解为这个数组的首地址
  3. a[3]是指向第4个元素
  4. 所以p指向第4个元素
  5. p[5]是从p后的5个 也就是第9个元素
  6. 所以b=9
  7. */

7、

  1. int a[][]={,,,,,};
  2. int *p;
  3. p=a[];
  4. printf("%d\n",*(p+));
  1. // *(p+3)所代表的数组元素是 a[1][0];

C语言 指针例解的更多相关文章

  1. 深入理解C语言 - 指针详解

    一.什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址.CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位.这里,数据对象是指存储在 ...

  2. C语言指针详解

    前言 这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文. 为什么需要指针? 指针解决了一些编程中基本的问题. 第一,指针的使用 ...

  3. c语言指针详解(转载)

    转自(http://blog.csdn.net/ad_ad_ad/article/details/1522145) 指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指 ...

  4. C语言指针详解(经典,非常详细)

    前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其 ...

  5. C语言--指针详解

    这段时间在看 Linux 内核,深觉 C 语言功底不扎实,很多代码都看不太懂,深入学习巩固 C 语言的知识很有必要.先从指针开始. 一.什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字 ...

  6. c语言指针详解 经典

    指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指针变量可以表示各种数据结构: 能很方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序 ...

  7. c语言指针说解

    一. 指针定义 1指针的意义 2指针的赋值 指针变量同普通变量一样,使用之前不仅要定义说明, 而且必须赋予具体的值.未经赋值的指针变量不能使用, 否则将造成系统混乱. #include <std ...

  8. [转]C语言指针详解(经典,非常详细)

    博文地址:https://blog.csdn.net/constantin_/article/details/79575638 写得很好啊! 这里写一下笔记好了 int p; //这是一个普通的整型变 ...

  9. C语言指针学习

    C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...

随机推荐

  1. JavaScript垃圾回收(二)——垃圾回收算法

    一.引用计数(Reference Counting)算法 Internet Explorer 8以下的DOM和BOM使用COM组件所以是引用计数来为DOM对象处理内存,引用计数的含义是跟踪记录每个值被 ...

  2. $.when(deferreds)

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong ) 1 引子 上一篇博文中介绍的Deferred,它表示一个延迟对象.但是很多时候,我们需要在多个延迟对象(异步代 ...

  3. Git:错误:error:src refspec master does not match any

    新建立了一个远程仓库,想着把项目放上去.于是在项目目录上: git init 然后就添加远程库 git remote add origin xxxx.git 然后就想push: git push -u ...

  4. JAVA - Redis的连接

    java连接linux Redis遇到的问题 昨天在Linux搭建了Redis服务,今天使用java连接测试了一下.要想使用java连接redis服务,就离不开jedis-2.6.1.jar.使用je ...

  5. Nancy 学习-身份认证(Basic Authentication) 继续跨平台

    开源 示例代码:https://github.com/linezero/NancyDemo 前面讲解Nancy的进阶部分,现在来学习Nancy 的身份认证. 本篇主要讲解Basic Authentic ...

  6. 有关微信开发中errorcode:-1 errmsg:system error 错误的一点原因

    如果你在微信开发中遇到{"errcode":-1,"errmsg":"system error,hints:[req_id:]"}这样的错误 ...

  7. 【SQL】统计所有表的行数

    环境:mssql ent 2k8 r2 原理:遍历所有用户表,用sp_spaceused过程分别获取每张表的行数并写入临时表,最后返回临时表 IF OBJECT_ID('tempdb..#TableR ...

  8. mysql,命令导入\导出表结构或数据

    在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看: mysqldump 最常用的: mysqldump -uroot -pmysql databasefo ...

  9. Java关键字用法及区别

    abstract 修饰词表明类或者成员方法具有抽象属性, 用于修饰类时 该类为抽象类 用于方法前 该方法为抽象方法. assert 用来进行程序调试 断言预判的意思. boolean 基本数据类型之一 ...

  10. HDU 5091---Beam Cannon(线段树+扫描线)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5091 Problem Description Recently, the γ galaxies bro ...