• 指针和内存

    • 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. 图像检索:CEDD(Color and Edge Directivity Descriptor)算法 颜色和边缘的方向性描述符

    颜色和边缘的方向性描述符(Color and Edge Directivity Descriptor,CEDD) 本文节选自论文<Android手机上图像分类技术的研究>. CEDD具有抽 ...

  2. 新闻网大数据实时分析可视化系统项目——17、Spark2.X分布式弹性数据集

    1.三大弹性数据集介绍 1)概念 2)优缺点对比 2.Spark RDD概述与创建方式 1)概述 在集群背后,有一个非常重要的分布式数据架构,即弹性分布式数据集(resilientdistribute ...

  3. dMd----攻防世界

    首先在Linux上查看题目,没有什么发现elf文件,之后使用ida打开看看,找到main函数,f5查看, 上图一些字符是char过的,便于查看,发现是一个if else语句,先经过了MD5加密然后判断 ...

  4. 云时代架构阅读笔记十六——Hystrix理解

    背景 分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务.如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商品服 ...

  5. angular.js开发 将多页面开发成单页面

    用angulara.js做单页面开发时,由于不能跨页面取数据,又需要传参,可以采用:$scope.step=0/1来解决这个问题,设置初始值为想要的页面即可.

  6. PHP使用ElasticSearch做搜索

    PHP 使用 ElasticSearch 做搜索 https://blog.csdn.net/zhanghao143lina/article/details/80280321 https://www. ...

  7. Python 使用 requests 模块发送请求的使用及封装

    一.requests 模块基本使用 1.准备接口的URL.请求参数.请求头 # 1. 构造注册.登录.充值请求的url register_url = "注册url" login_u ...

  8. 039、Java中逻辑运算之普通与运算“&”

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

  9. 015、MySQL取今天是第几季度,往后几个月是第几季度

    #取今天是第几季度 SELECT QUARTER( curdate( ) ); #取往后几个月是第几季度 , INTERVAL MONTH ) ); , INTERVAL MONTH ) ); , I ...

  10. Delphi另一个多线程函数:BeginThread用法

    Delphi另一个多线程函数:BeginThread━━━━━━━━━━━━━━━━━━━━━━━━━━ Delphi也提供了一个相同功能的类似函数:function BeginThread(    ...