• 指针和内存

    • C程序在编译后,会以三种形式使用内存:

      • 静态、全局内存:静态变量和全局变量使用这部分内存,生存周期为整个程序运行时,全局变量所有函数都可以访问,但静态变量虽然生存周期为整个程序运行时,但作用域和局部变量是一样的,只限于定义它的函数内部,全局变量和静态变量会执行默认初始化。
      • 自动内存,也就是所说的栈上,局部变量,在函数内部声明,并且只有函数被调用时才创建,生命周期和作用域都随函数开始而开始,函数结束而结束,由系统自行回收
      • 动态内存,也就是所说的堆,手动申请内存,手动释放
  • 声明指针:
    • 通过在数据类型后面跟星号(*),再加上指针变量名就可以声明指针,如:int *pi; pi是一个指向int型变量的指针
  • 如何阅读声明:
    • 介绍一种可以更容易理解指针变量的方法,就是倒过来念声明,也就是从右向左念,比如:const int *pci;
 pci是一个变量                   const int *pci;
pci是一个指针变量    const int *pci;
pci是一个指向int类型的指针变量 const int *pci;
pci是一个指向int常量的指针变量 const int *pci;
  • 指针的初始化:

    • 地址操作符&会返回操作数的地址,我们可以使用地址操作符来初始化指针:
 int num;                //num是一个int类型变量
int *pi = # //通过&获取num地址然后赋值给指针变量pi完成初始化
  • 接引指针:

    • 间接引用操作符(*)返回指针所指向的值,一般称之为解引指针,比如:
 int num = ;    //创建int型变量num并初始化为5
int *pi = # //创建指针pi指向num
printf(“%d\n”,*pi); //通过解引指针,输出指针所指向的值,值为5
  • null的概念

    • NULL被赋值给指针就意味着指针不指向任何数据,null的概念是指指针包含了一个特殊的值,和其它指针不同的是,没有指向任何内存区域(注意:两个null指针总是相等的)
    • NULL宏是强制类型转换为void指针的整数常量0,在很多库中定义:#define NULL ((void*)0) 
    • null指针和未初始化的指针是不同的,未初始化的指针可能包含任何值,但null指针则是不指向任何内存区域的
    • 我们可以给指针赋值常量0表示空指针,但不能赋予任何别的数值
    • 注意:任何时候都不要对null指针进行解引操作,否则会造成程序终止
    • 由于null值会被解释成为0值,所以可以使用指针作为逻辑表达式的唯一操作数:
 if (pi)
{
//pi不为null
}else{
//pi为null
}
  • void指针:

    • void指针是通用指针,任何类型的指针都可以转换为void指针,也可以转换回原来的指针的类型
  • 指针长度和类型:
    • 在大部分现代平台上,数据指针的长度通常是一样的,与指针类型无关,取决于使用的机器和编译器
    • sizeof操作符可以用来判断指针长度,如: printf(“Size of *char: %d\n”,sizeof(char*));
    • size_t: size_t类型表示C中任何对象所能达到的最大长度,定义在stddef头文件中,是一个与机器相关的unsigned类型,用作sizeof操作符的返回值类型,典型的定义如下:
 #ifndef _SIZE_T
#define _SIZE_T
typedef unsigned int size_t;
#endif
  • 指针操作符:

    • 解引操作符:* ,用来解引指针
    • 指向操作符:-> ,用来访问指针引用的结构的字段
    • +、—操作符:用来对指针执行加减法
    • ==、!=操作符:用来比较两个指针
  • 指针的常见用法:
    • 指向常量的指针:不能通过指针修改所引用的值,但可以改变指针,可以解引pci读取所指值,但不能解引来修改它

       int num = ;    //定义一个整型变量num,赋值为5
      const int limit = ; //定义一个整型常量limit,赋值为500
      int *pi; //定义一个指向整数的指针pi
      const int *pci; //定义一个指向整型常量的指针pci pi = # //指针pi指向num
      pci = &limit; //指针pci指向limit //pci可以被修改为指向不同的整数常量
      //pci可以被修改为指向不同的非整数常量
      //可以解引pci读取数据
      //不可以解引pci从而修改它指向的数据
    • 指向非常量的常量指针:指针不可变,所指数据可变
    •  int num;
      int *const chi = #
      //cpi必须被初始化为指向非常量变量
      //cpi不能被修改
      //cpi所指数据可以被修改,也就是解引cpi赋新值
    • 指向常量的常量指针:指针与所指数据都不能被修改
    •  const int *const clci = &limit;
      //声明常量指针时一定要初始化

深入理解C指针<一>的更多相关文章

  1. 深入理解C指针之五:指针和字符串

    原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...

  2. 深入理解C指针之六:指针和结构体

    原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...

  3. 深入理解C指针之四:指针和数组

    原文:深入理解C指针之四:指针和数组 数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数 ...

  4. 深入理解C指针之三:指针和函数

    原文:深入理解C指针之三:指针和函数 理解函数和指针的结合使用,需要理解程序栈.大部分现代的块结构语言,比如C,都用到了程序栈来支持函数的运行.调用函数时,会创建函数的栈帧并将其推到程序栈上.函数返回 ...

  5. 深入理解C指针之一:初识指针

    原文:深入理解C指针之一:初识指针 简单来说,指针包含的就是内存地址.理解指针关键在于理解C的内存管理模式.C里面有三种内存: ①.静态全局内存(生命周期从程序开始到程序结束,全局变量作用域是全局,静 ...

  6. 深入理解C指针之二:C内存管理

    原文:深入理解C指针之二:C内存管理 内存管理对所有程序来说都很重要.有时候内存由运行时系统隐式的管理,比如为变量自动分配内存.在这种情况下,变量分配在它所处的函数的栈帧上(每个函数都有它自己的栈帧, ...

  7. C 真正理解二级指针

    本文转载自CSDN博主liaoxinmeng,做数据结构时遇到指针方面的问题,想了许久,因此我觉得很有必要复习一下二级指针及其使用 正文如下: 指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也 ...

  8. C语言指针使用小记 (深入理解C指针 读后小记)

    最近正值过年在家,新年初一,闲暇时间无事可做便把以前看过的书籍整理了一下,顺手也把这本“深入理解C指针”的书重新读了一遍,这本书总体感觉比较简单,但是还是不免有些地方是平时没有想到过或者没有注意到的, ...

  9. 《深入理解C指针》

    <深入理解C指针> 基本信息 原书名:Understanding and using C pointers 作者: (美)Richard Reese 译者: 陈晓亮 丛书名: 图灵程序设计 ...

  10. 深入理解C指针----学习笔记

      深入理解C指针     第1章 认识指针   理解指针的关键在于理解C程序如何管理内存,指针包含的就是内存地址.     1.1 指针和内存   C程序在编译后,以三种方式使用内存: 1. 静态. ...

随机推荐

  1. 新闻网大数据实时分析可视化系统项目——19、Spark Streaming实时数据分析

    1.Spark Streaming功能介绍 1)定义 Spark Streaming is an extension of the core Spark API that enables scalab ...

  2. 一步步教你整合SSM框架(Spring MVC+Spring+MyBatis)详细教程重要

    前言 SSM(Spring+SpringMVC+Mybatis)是目前较为主流的企业级架构方案,不知道大家有没有留意,在我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教 ...

  3. springboot整合logback集成elk实现日志的汇总、分析、统计和检索功能

    在Spring Boot当中,默认使用logback进行log操作.logback支持将日志数据通过提供IP地址.端口号,以Socket的方式远程发送.在Spring Boot中,通常使用logbac ...

  4. 058、Java中定义一个没有参数没有返回值的方法

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  5. DevOps - 与传统方式区别

    章节 DevOps – 为什么 DevOps – 与传统方式区别 DevOps – 优势 DevOps – 不适用 DevOps – 生命周期 DevOps – 与敏捷方法区别 DevOps – 实施 ...

  6. Install and Configure NFS Server on RHEL 8 / CentOS 8

    https://computingforgeeks.com/install-and-configure-nfs-server-on-centos-rhel/    

  7. C# MQTT M2MQTT

    MQTT 入门介绍 MQTT是基于二进制消息的发布/订阅编程模式的消息协议 实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish).代理(Bro ...

  8. WebStorm 使用经验

        1.优点 1.1 可自动提示图片的宽高 1.2 标签名字可重构(改名) 1.3 css重命名 1.4 可把内联的style移到外部 1.5 可实现声明提升 1.6 设置项是可搜索的 1.7 有 ...

  9. SSM整合搭建过程中的一个怪异问题

    好久没有搭建框架了,昨天开始试图搭建一个SSM框架,各种配置文件搭建成功,服务器也启动正确,但是在运行过程中,发现总是不能获取JDBC,不能够创建连接池工厂,报错如下:网页报500错误码 SEVERE ...

  10. [LeetCode] 933. Number of Recent Calls 最近的调用次数

    Write a class RecentCounter to count recent requests. It has only one method: ping(int t), where t r ...