什么是指针?理解指针之前得知道什么是地址.

1.数据在计算机中的存储形式:

数据在计算机中是以二进制的形式存储的.计算机的存储器是用半导体集成电路构成的,有N多个二极管元件组成.

每一个二极管元件就如同是一个开关,有两种状态,导通和截止,分别用0和1表示,比如有四个相邻的二极管元件,1和3分别都是导通,则这种状态用1010表示,即可代表整数10.

2.位,字节和地址

(1)位(bit),或叫"比特",每一个二极管元件称为一个"二进制位",是存储信息的最小单位,值是1或0

(2)字节(byte),或叫"拜特".一个存储器包含很多个"二进制位",直接用位来表示和管理很不方便.通常将8个"二进制位"组织成一组,称为"字节",这是最常用的存储单位.通常的占内存200KB,就是占200KB字节,内存为4GB,就是指4GB字节

(3)地址,地址是内存单元的编号.CPU不能直接操作硬盘,只能直接访问内存.

看下图

微机原理中,CPU是通过三根线与内存进行"打交道"的,内存编号是从0开始的 地址线如果有32根.就可以访问控制2^32个字节空间,

也就是4GB(4GB=4*1024MB=4*1024*1024KB=4*1024*1024*1024B(2^32字节)).

那么内存编号范围就是0--4GB-1(FFFFFFFF),所以我们经常可以看见地址编号是5a3fg之类的这种编号 就是用十六进制表示的.

3.那么什么是指针?

指针就是地址,地址就是指针.一个变量的地址就是该变量的指针,指针指向该变量单元,那么通过该变量的指针(地址),就能找到访问该变量.把专门用来存放另外一个变量的指针的变量称为"指针变量",指针变量的值(指针变量中存放的地址)就是地址(指针).指针变量就是存放地址的变量.

下面来看一个程序例子:

  1. #include <stdio.h>
  2. void main()
  3. {
  4. int * p;
  5. /*
  6. p是个指针变量(变量名字),int*表示p变量只能存放int类型变量的地址,
  7. *表示指向的对象,*p代表p所指向的变量,*p最准确的解释:表示的是以p的内容(值)为地址的变量
  8. 例如p的值现在为33f8bc 那么谁的地址是33f8bc,那么*p就等价谁
  9. */
  10. int i=;
  11. int j;
  12. p=&i;//p存放了i的地址,那么p就指向变量i
  13. printf("%x\n",p);
  14. }

仔细反复读一下上面的注释,相信你会有收获的.

4.

如何通过被调函数改变主调函数中普通变量的值
1)实参为相关变量的地址
2)形参为以该变量的类型为类型的指针变量
3)在被调函数中通过 *形参变量名 的方式可以修改主函数中变量的值

  1. # include <stdio.h>
  2. void f(int *i)
  3. {
  4. *i=;
  5.  
  6. }
  7. void main()
  8. {
  9. int i=;
  10. f(&i);
  11. printf("%d\n",i);
  12. }

但是如果是下面这样的,是不能改变i的值的

  1. # include <stdio.h>
  2. void f(int i)
  3. {
  4. i=;
  5.  
  6. }
  7. void main()
  8. {
  9. int i=;
  10. f(i);
  11. printf("%d\n",i);
  12. }

当然你把函数换成int类型的 调用 之后接受它的一个返回值 那么也是可以实现的

5.指针与一维数组(学数据结构中的顺序存储结构会很有用)

直接看个例子吧

  1. # include <stdio.h>
  2. void main ()
  3. {
  4. int a[]={,,,,};
  5. printf("%x\n",a);
  6. printf("%x\n",&a[]);
  7. /*总结:
  8. 1.一维数组变量名就是指向数组第一个元素,是个指针常量,值不能被改变
  9. 存放的是第一个元素的地址,此程序运行结果,两者输出是一样的
  10. 2.数组的下标和指针变量的关系
  11. a[i]<<==>>*(a+i)
  12. i=3,因为a指向第一个元素,那么a+3指向第四个元素,那么*(a+i)就是第四个元素本身,也就是a[3]
  13. 3.指针变量的运算
  14. 指针变量之间不能互相加,乘,除,但是若两个指针变量在同一个数组那么他们可以相减.
  15. 指针变量可以加减一整数,前提是最终结果不能超过指针的范围
  16. */
  17. }

直接看上面的注释吧 基本的东西已经写在上面了

C语言灵魂--指针的更多相关文章

  1. 浅谈c语言的指针

    对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了.c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分. 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据 ...

  2. 快速上手系列-C语言之指针篇(一)

    快速上手系列-C语言之指针篇(一) 浊酒敬风尘 发布时间:18-06-2108:29 指针的灵活运用使得c语言更加强大,指针是C语言中十分重要的部分,可以说指针是C语言的灵魂.当然指针不是万能的,但没 ...

  3. C#委托与C语言函数指针及函数指针数组

    C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...

  4. C语言二重指针与malloc

    (内容主要源于网上,只是加入了些自己的剖析) 假设有一个二重指针: char **p; 同时有一个指针数组 char *name[4]; 如何引用p呢? 首先我们有程序代码如下 #include &l ...

  5. C语言函数指针基础

    本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...

  6. 为什么C/C++语言使用指针

    这是参加面试时,面试官问的一道开放性题目. 问题是:为什么C/C++语言使用指针? 这个问题一问出来,直接被面试官秒杀了,面试官大神,你怎么不按套路出牌啊? 说好的malloc和new的区别呢?说好的 ...

  7. C语言的指针变量

    C语言的指针变量 在C语言中,变量是固定范围的存储空间,它存储的是赋给他的值, 比如: ; /* 这里是定义一个整型变量a,并把12这个值存储在a的地址空间上 这个地址空间是系统随机分配的,对用户是透 ...

  8. Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

    Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...

  9. “对外部(局部)变量的访问”是C语言函数指针的最大弱点

    1.“对外部(局部)变量的访问”是C语言函数指针的最大弱点 . #include <stdio.h> #include <stdlib.h> /* 结构体定义 */ struc ...

随机推荐

  1. select、poll和epoll比较

    select select能监控的描述符个数由内核中的FD_SETSIZE限制,仅为1024,这也是select最大的缺点,因为现在的服务器并发量远远不止1024.即使能重新编译内核改变FD_SETS ...

  2. Mac系统下配置JAVA Maven Ant 环境变量

    Mac 启动加载文件位置(可设置环境变量) ------------------------------------------------------- (1)首先要知道你使用的Mac OS X是什 ...

  3. Kali-linux设置ProxyChains

    ProxyChains是Linux和其他Unices下的代理工具.它可以使任何程序通过代理上网,允许TCP和DNS通过代理隧道,支持HTTP.SOCKS4和SOCKS5类型的代理服务器,并且可配置多个 ...

  4. master分支合并

    一.Sourcetree简单介绍 通过Git可以进行对项目的版本管理,但是如果直接使用Git的软件会比较麻烦,因为是通过一条一条命令进行操作的.  Sourcetree则可以与Git结合,提供图形界面 ...

  5. form表单上传文件

    一.formData()直接获取form表单数据 例子:获取form表单的id给formData(),然后传给后台. 要求: 传入值的name值必须与后台接受的name相对应. form表单不能嵌套, ...

  6. Tomcat整体介绍

    来源 本文整理自 <Tomcat内核设计剖析>.<Tomcat结构解析> Tomcat 整体架构 ​ 如上图所示:包含了Tomcat内部的主要组件,每个组件之间的层次包含关系很 ...

  7. iview中position: 'fixed'最顶层z-index

    使用iview时候使用<Header :style="{position: 'fixed', width: '100%'}">不是最顶层解决方案 根据样式进行解决在ap ...

  8. tensorflow节点布放(device assignment of node)算法:simpler_placer

    tensorflow v0.9中目前在用的devcie assignment算法是simple placer算法,相比于白皮书中cost model算法实现简单.simpler placer算法优先选 ...

  9. javaSpring知识点总结

    1 js 概述 js是一门基于对象和事件驱动的脚本语言,主要应用在客户端 js特点: 交互性(信息的动态交互) 安全性(不允许直接访问本地硬盘) 跨平台(只要是可以解释js的浏览器都可以执行,和平台无 ...

  10. 简单的反编译class文件并重新编译的方法

    在没有.java源码的情况下,如果想修改一个.class文件.可以通过以下步骤实现: 修改前的class文件: 一.反编译.class文件成.java文件. 1.可以使用Java Decompiler ...