深入理解C指针<一>
- 指针和内存
- C程序在编译后,会以三种形式使用内存:
- 静态、全局内存:静态变量和全局变量使用这部分内存,生存周期为整个程序运行时,全局变量所有函数都可以访问,但静态变量虽然生存周期为整个程序运行时,但作用域和局部变量是一样的,只限于定义它的函数内部,全局变量和静态变量会执行默认初始化。
- 自动内存,也就是所说的栈上,局部变量,在函数内部声明,并且只有函数被调用时才创建,生命周期和作用域都随函数开始而开始,函数结束而结束,由系统自行回收
- 动态内存,也就是所说的堆,手动申请内存,手动释放
- 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;
//声明常量指针时一定要初始化
- 指向常量的指针:不能通过指针修改所引用的值,但可以改变指针,可以解引pci读取所指值,但不能解引来修改它
深入理解C指针<一>的更多相关文章
- 深入理解C指针之五:指针和字符串
原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...
- 深入理解C指针之六:指针和结构体
原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...
- 深入理解C指针之四:指针和数组
原文:深入理解C指针之四:指针和数组 数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数 ...
- 深入理解C指针之三:指针和函数
原文:深入理解C指针之三:指针和函数 理解函数和指针的结合使用,需要理解程序栈.大部分现代的块结构语言,比如C,都用到了程序栈来支持函数的运行.调用函数时,会创建函数的栈帧并将其推到程序栈上.函数返回 ...
- 深入理解C指针之一:初识指针
原文:深入理解C指针之一:初识指针 简单来说,指针包含的就是内存地址.理解指针关键在于理解C的内存管理模式.C里面有三种内存: ①.静态全局内存(生命周期从程序开始到程序结束,全局变量作用域是全局,静 ...
- 深入理解C指针之二:C内存管理
原文:深入理解C指针之二:C内存管理 内存管理对所有程序来说都很重要.有时候内存由运行时系统隐式的管理,比如为变量自动分配内存.在这种情况下,变量分配在它所处的函数的栈帧上(每个函数都有它自己的栈帧, ...
- C 真正理解二级指针
本文转载自CSDN博主liaoxinmeng,做数据结构时遇到指针方面的问题,想了许久,因此我觉得很有必要复习一下二级指针及其使用 正文如下: 指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也 ...
- C语言指针使用小记 (深入理解C指针 读后小记)
最近正值过年在家,新年初一,闲暇时间无事可做便把以前看过的书籍整理了一下,顺手也把这本“深入理解C指针”的书重新读了一遍,这本书总体感觉比较简单,但是还是不免有些地方是平时没有想到过或者没有注意到的, ...
- 《深入理解C指针》
<深入理解C指针> 基本信息 原书名:Understanding and using C pointers 作者: (美)Richard Reese 译者: 陈晓亮 丛书名: 图灵程序设计 ...
- 深入理解C指针----学习笔记
深入理解C指针 第1章 认识指针 理解指针的关键在于理解C程序如何管理内存,指针包含的就是内存地址. 1.1 指针和内存 C程序在编译后,以三种方式使用内存: 1. 静态. ...
随机推荐
- KAZE特征和各向异性扩散滤波
kaze feature: http://www.doc88.com/p-6911376909693.html 各向异性扩散滤波 Scale-space and edge detection usi ...
- HihoCoder 1246:王胖浩与环
#1246 : 王胖浩与环 时间限制:6000ms 单点时限:1000ms 内存限制:256MB 描述 王胖浩有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字. 对 ...
- Day7 - D - The Euler function HDU - 2824
The Euler function phi is an important kind of function in number theory, (n) represents the amount ...
- Eclipse 不能调试的问题
现象 弹出 Cannot connect to VM Console 中的输出是: ERROR: transport error 202: connect failed: Connection ref ...
- Fréchet Inception Distance(FID)
计算 IS 时只考虑了生成样本,没有考虑真实数据,即 IS 无法反映真实数据和样本之间的距离,IS 判断数据真实性的依据,源于 Inception V3 的训练集 ------ ImageNet,在 ...
- CAN分帧发送程序说明
试验平台 仅仅 需要一台主机 一台 周立功 CAN 助手, 一个232 助手就OK ICAN 协议 资源节点地址 电脑 我认为是0x01 51单片机主机的地址 是 0x1f 建立连接的 功能码 是0x ...
- Ican协议建立连接我的感悟
有一个情形我突然之间想明白了. 注意下面情形: 假设节点A与节点B已经 正常的建立了连接,并且进行了通讯. 假设 节点B收到了 节点A 的 &q ...
- UVA - 548 Tree(二叉树的递归遍历)
题意:已知中序后序序列,求一个叶子到根路径上权和最小,如果多解,则叶子权值尽量小. 分析:已知中序后序建树,再dfs求从根到各叶子的权和比较大小 #include<cstdio> #inc ...
- 7 —— node —— 响应图片
const http = require('http'); const fs = require('fs'); const server = http.createServer(); server ...
- Java8集合框架——LinkedHashSet源码分析
本文的目录结构如下: 一.LinkedHashSet 的 Javadoc 文档注释和简要说明 二.LinkedHashSet 的内部实现:构造函数 三.LinkedHashSet 的 add 操作和 ...