深入理解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. 静态. ...
随机推荐
- SciPy fftpack(傅里叶变换)
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- spring bean容器学习
bean是Spring种最核心的东西 ,如果说Spring是个水桶的话,bean就是桶里面的水,桶里面没有水也就没有意义了. public class MyTestBean { private Str ...
- robot_framework + selenium + 上传本地文件+win7 32位
1.下载与安装AutoIt v3 地址链接:http://pan.baidu.com/s/1hqsDFBA,我自己是32位的系统,用这个运行可以 2.安装完成后,如下图所示 3. AutoIt Wi ...
- Ternsorflow 学习:006-MNIST进阶 深入MNIST
前言 这篇文章适合实践过MNIST入门的人学习观看.没有看过MNIST基础的人请移步这里 深入MNIST TensorFlow是一个非常强大的用来做大规模数值计算的库.其所擅长的任务之一就是实现以及训 ...
- jenkins#自动构建并部署springboot的jar包
1.GitLab 8.0.0(版本比较低,配置比较简单) 配置 点击项目 --> settings --> web Hooks 2.jenkins配置
- Day5 - H - Supermarket POJ - 1456
A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold ...
- 打开exe并传参
shellexecute(Application.Handle,'open',PWideChar('E:\控件\TMS.Scripter.Studio.Pro..6.0.2.0.Delphi.BCB. ...
- DataFoundation比赛总结
2018.3.20号左右,因为研究生的数据挖掘课程的老师要求我们集体参加一个比赛 ,所以在比赛参与时间.比赛难度和比赛类型的几种条件下,我们选择了2018平安产险数据建模大赛-驾驶行为预测驾驶风险比赛 ...
- MongoDB_01
解释:MongoDB可应对 --三高需求 High performance-对数据库高并发读写的需求 Huge Storage -对海量数据的高效率存储和访问的需求 High Scalability ...
- HDU 5501:The Highest Mark 01背包
The Highest Mark Accepts: 71 Submissions: 197 Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...