热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言入门篇(二)指针的介绍和运用

一.内存1.内存的含义:内存是沟通CPU和硬盘的桥梁:(1)暂存CPU中的运算数据(2)暂存与

 一.内存

  1.内存的含义:

    内存是沟通CPU和硬盘的桥梁: 

      (1)暂存CPU中的运算数据

      (2)暂存与外部存储器交换的数据

    物理存储器:实际存在的具体存储器芯片

               主板上装插的内存条

            显示卡上的显示RAM芯片

          各种适配卡上的RAM芯片和ROM芯片

     存址空间:对存储器编码的范围。我们在软件上常说的内存是指这一层含义

      (1)编码:对每个物理存储单元(一个字节)分配一个号码

      (2)寻址:可以根据分配的号码找到相应的存储单元,完成数据的读写

         理解:可以将内存 抽象理解为一个超大的一维字符数组,通过下标(对每个字节分配的号码-与操作系统有关,例如 操作系统为32位,号码就是32位的编号)

         拓展:现在可以理解为什么系统会影响内存的性能,32位操作系统寻址范围 就是 2的32次方也就是4G 所以最大内存为4G

  指针和指针变量:

      (1)内存中每一个字节都有自己的编号,这就是“地址”

      (2)如果程序中定义了一个变量,程序运行或者编译时,系统就会给这个变量分配内存单元,并确定他的地址(编号)

      (3)指针实质就是内存“地址”。指针就是地址,地址就是指针

      (4) 指针是内存单元的编号,指针变量是存放地址的变量

  

  关于野指针,空指针,万能指针大家可以去找些资料,这里只贴代码,不做解释

  此处强调一下 ,将NULL赋给指针,此指针就被称为空指针,因为NULL是一个值为0的宏常量

  什么是宏?

    (百度百科)宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。这种替换在预编译时进行,称作宏展开。

  二:const修饰指针变量

    const 限定一个变量不允许被改变,产生静态作用

    用const修饰变量是不安全的 (可以通过高一级指针修改)

    const int * i  = &a    等价于 int const * i = &a    此时const修饰的是 int *  ,所以 *i 是不允许赋值 ,也就是不能间接修改a的值,但是指向地址可以 修改 如 i = &b 

    int * const i = &a     此时const修饰的是 变量 i ,所以i 指向的地址不能修改,但是 *i = 200 可以通过,也就修改了a 的值

    const int *  const i = &a  值和地址都不能修改   

  三:指针和数组

    int [] i = {1,2,3,4,5};

    i 为数组第一个元素的地址,但他是一个常量

    i = 10 ;   // 发生错误,因为虽然 i 指向元素地址,但是i是一个常量

    sizeof() 方法 ,判断占用多少字节

  四:指针加减运算

    指针的加减运算不像我们所想到加减

    如果一个 int * ,+1的结果就是增加了一个int 类型大小   -----int * i = 20; i = i+1;  就是原地址移动4位

    如果是一个char *,+1的结果是增加一个char大小 --------  ...

    什么类型 * + 1 就移动原地址一个类型位 (指针乘除没有意义)

  五:多级指针

    C语言允许有多级指针存在,在实际的程序中一级指针最常用,其次是二级指针。

    二级指针就是指向一个一级指针变量地址的指针,三级......

    int a = 1;

    int * b = &a;  //一级指针,指向a的地址

    int **c = &b; // 二级指针,指向b的地址 ,*c 就是 b , *cc 就是 a

    int ***d = &c; //三级指针,指向c的地址,*d就是c,**d就是b,***d就是a

 

  

 

    

      

 

 


转载于:https://www.cnblogs.com/Mr-Hai/p/10245181.html


推荐阅读
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • 本文介绍了一种解决二元可满足性(2-SAT)问题的方法。通过具体实例,详细解释了如何构建模型、应用算法,并提供了编程实现的细节和优化建议。 ... [详细]
  • 本文探讨了如何在模运算下高效计算组合数C(n, m),并详细介绍了乘法逆元的应用。通过扩展欧几里得算法求解乘法逆元,从而实现除法取余的计算。 ... [详细]
  • 本文详细探讨了HTTP 500内部服务器错误的成因、解决方案及其在Web开发中的影响。通过对具体案例的分析,帮助读者理解并解决此类问题。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文详细介绍了C语言中的指针,包括其基本概念、应用场景以及使用时的优缺点。同时,通过实例解析了指针在内存管理、数组操作、函数调用等方面的具体应用,并探讨了指针的安全性问题。 ... [详细]
  • 本文探讨了如何使用自增和自减运算符遍历二维数组中的元素。通过实例详细解释了指针与二维数组结合使用的正确方法,并解答了常见的错误用法。 ... [详细]
author-avatar
actthank90909
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有