• 指针和内存

    • 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. KAZE特征和各向异性扩散滤波

    kaze feature: http://www.doc88.com/p-6911376909693.html 各向异性扩散滤波  Scale-space and edge detection usi ...

  2. HihoCoder 1246:王胖浩与环

    #1246 : 王胖浩与环 时间限制:6000ms 单点时限:1000ms 内存限制:256MB 描述 王胖浩有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字. 对 ...

  3. Day7 - D - The Euler function HDU - 2824

    The Euler function phi is an important kind of function in number theory, (n) represents the amount ...

  4. Eclipse 不能调试的问题

    现象 弹出 Cannot connect to VM Console 中的输出是: ERROR: transport error 202: connect failed: Connection ref ...

  5. Fréchet Inception Distance(FID)

    计算 IS 时只考虑了生成样本,没有考虑真实数据,即 IS 无法反映真实数据和样本之间的距离,IS 判断数据真实性的依据,源于 Inception V3 的训练集 ------ ImageNet,在 ...

  6. CAN分帧发送程序说明

    试验平台 仅仅 需要一台主机 一台 周立功 CAN 助手, 一个232 助手就OK ICAN 协议 资源节点地址 电脑 我认为是0x01 51单片机主机的地址 是 0x1f 建立连接的 功能码 是0x ...

  7. Ican协议建立连接我的感悟

    有一个情形我突然之间想明白了. 注意下面情形:                             假设节点A与节点B已经 正常的建立了连接,并且进行了通讯. 假设 节点B收到了 节点A 的 &q ...

  8. UVA - 548 Tree(二叉树的递归遍历)

    题意:已知中序后序序列,求一个叶子到根路径上权和最小,如果多解,则叶子权值尽量小. 分析:已知中序后序建树,再dfs求从根到各叶子的权和比较大小 #include<cstdio> #inc ...

  9. 7 —— node —— 响应图片

      const http = require('http'); const fs = require('fs'); const server = http.createServer(); server ...

  10. Java8集合框架——LinkedHashSet源码分析

    本文的目录结构如下: 一.LinkedHashSet 的 Javadoc 文档注释和简要说明 二.LinkedHashSet 的内部实现:构造函数 三.LinkedHashSet 的 add 操作和 ...