C语言进阶--DAY3
主要讲解数组和指针有关问题
1. 数组名的本质是一个常量指针
2. 内存编址的最小单位是字节,对于变量来说,一个变量可以取1、2、4、8等字节,对变量取地址来说,取的是低位字节的地址,在32位机中其对变量取地址就是4,不管其占几个字节。如下例
经过分析我们可以得出:指针的大小为4
3. 指针的本质:一个有类型的地址
以上实验说明指针是一个有类型的地址,常量指针
4. int p中,*号起的作用是指针的声明以及指定大小,类型决定寻址能
对于这个*号,注意如下的情况
int *p=&data;(1)
printf(“%x\n”,*p);(2)
(1)(2)两处的*是不一样的,(1)处的是指针的声明,(2)处的于与&data之间的引用和解引用的关系
5. 指针的运算,指针的+1和数值的+1是不一样的,观察下列程序
输出结果分别为:0x15, -5, 5
注意到第一个输出结果是指针的相加,步长为4,后两个为数值的加减,步长为1
6. 数组名作为成员访问的时候就是一个一级指针, & 和 * 实现了一级指针(数组名)到数组指针之间的切换
输出的结果为:
arr = 0xbffd24dc
arr+1 = 0xbffd24e0
&arr = 0xbffd24dc
&arr+1 = 0xbffd24f0
*&arr = 0xbffd24dc
*&arr+1 = 0xbffd24e0
7. 为了帮助理解数组在内存中的线性存储,做以下练习
由已学知识,数组在内存中的存储如下
a代表数组名,本来是一次跳动的格数为4,当对其取地址后,&a+1直接跳到蓝色的箭头那里,ptr1[-1]也可以写做*(ptr1-1),即向下移动4个单元格,因此移动到绿色箭头处,从绿色箭头开始向上打印出四个单元格,即5
对a进行强转即(int)a使得其每次跳动的格数为1,即(int)a+1跳转到紫色箭头处,由此开始向上打印4个单元格,即2000000;
8. 二级指针:
char ch=’m’;
char *pc=&ch;
char* *ppc=&pc
此处对两个*的解释为:*ppc代表此为一个指针,char*表示此指向类型是一个指针类型
通过二级指针,实现了对数据空间的间接访问,如下所示
通过二级指针,可以改变一级指针的指向问题,见下列例子
注意:想要改变指针指向的内容,就必须要传递指针的地址,因此会出现二级指针
通过一级指针可以改变0级指针指向问题
通过二级指针可以改变一级指针指向问题
通过三级指针可以改变二级指针指向问题
8. 通过对二级指针,改变了一级指针的指向问题,也叫对一级指针的初始化问题
如上所见,指针p原本指向一个空指针,改变指向后使其指向一个有200个字节的空间,也可以看作是对其的一次初始化
9. 一级指针和二级指针的步长
一级指针的步长是与其类型相关的,二级指针的步长是固定的4,扩展:二级以上的指针的步长都是4
long long* *pp=&p;但凡有long long*的都是一个指针的大小,因此步长是4
10. 指针数组(字符指针数组):指针数组的本质是数组,数组中的每一个成员是一个指针
char * pARR[10]={“apple”,”banana”,”orange”};
数组指针:本质是一个指针,int (*p)[4]—其本质应为int[4] *p,可见本质是一个指针
10. 二级指针访问指针数组
由于指针数组的本质就是一个数组,因此在学习时可以类比数组的访问,数组访问方法:下标访问(偏移)以及指针访问
等价性:
int arr[10]={1,23,4};
int *p=arr; //此处的等价性为:arr即为数组的首地址,
&arr[0] à&int àint *
由于在数组中我们常常用指针来进行访问,因此我们想用指针来访问指针数组
类比利用一级指针对数组进行访问,可以得出利用指针对指针数组的访问
对于char * *p=pa来说,pa 相当于&pa[0]à&char *àchar **即为一个二级指针
pa和**p完全等价的原因:
其中箭头代表指向关系
pa代表指针数组的首元素地址,pa+1每次加4,char*+1也是每次加4,在图中表示一个单元格的范围
同时,由于p=pa,因此pa[1]代表的地址为0x14c0b,p[1]代表的地址也是0x14c0b
C语言进阶--DAY3的更多相关文章
- 【R笔记】R语言进阶之4:数据整形(reshape)
R语言进阶之4:数据整形(reshape) 2013-05-31 10:15 xxx 网易博客 字号:T | T 从不同途径得到的数据的组织方式是多种多样的,很多数据都要经过整理才能进行有效的分析,数 ...
- 《C语言进阶剖析》课程目录
<C语言进阶剖析>学习笔记 本文总结自狄泰软件学院唐佐林老师的<C语言 ...
- 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目入口与路由EP01
书接上回,我们已经安装好Iris框架,并且构建好了Iris项目,同时配置了fresh自动监控项目的实时编译,万事俱备,只欠东风,彩虹女神蓄势待发.现在我们来看看Iris的基础功能,如何编写项目入口文件 ...
- R语言进阶
一.初学入门:<R in Action><The Art of_R Programming>入门者可首选两本,前者从统计角度入手,分高中低三部分由浅入深的讲解了如何用R来实现统 ...
- C 语言 进阶
清单狂魔,只挖坑不填坑.. 前言 最近经常被询问 C 语言 相关的问题,突然便也觉得需要思考一下 C 语言的进阶了. 我用 C 语言写过的最大的一个项目,也只是那个贪吃蛇,后来就断断续续地用 Pyth ...
- 编程C语言进阶篇——自定义数据类型:共同体
什么是"自定义数据类型"?顾名思义,就是用户可以随时在程序中自行定义新的数据类型.自定义数据类型时需要设置数据类型的名称及其成员.数据类型成员各属性的设置方法等同于变量设置时相应属 ...
- 编程C语言进阶篇——自定义数据类型:结构体
一.结构体 定义方法: 结构名 变量名 特点: 两个同类型的结构变量可以相互赋值,但是结构变量之间不能使用"<","=="等运算符,如果使用则需要对运算符 ...
- 苹果新的编程语言 Swift 语言进阶(六)--函数和闭包
一 .函数 1.1. 函数的定义和调用 函数的定义以funckeyword作为前缀,接着是函数名字,接着跟着一个能够带有參数.也能够不带參数的圆括号.接着用-> 指示函数的返回类型. 函数运行体 ...
- 苹果新的编程语言 Swift 语言进阶(五)--控制流
Swift 语言支持C语言全部的控制语句.包含for 和while循环语句,if和switch条件语句,以及break和continue控制语句等. Swift 语言除了支持以上语句,还添加了一个f ...
随机推荐
- 莫烦scikit-learn学习自修第四天【内置训练数据集】
1. 代码实战 #!/usr/bin/env python #!_*_ coding:UTF-8 _*_ from sklearn import datasets from sklearn.linea ...
- 百度云虚拟主机配置 Thinkphp5.1
材料 服务器:百度云虚拟主机(nginx+php7.0+linux) Thinkphp 5.1 问题 百度云默认目录为/webroot,但是我们的需求是将项目存放到/webroot/public下面. ...
- 云服务器ECS
云服务器Elastic Compute Service(ECS)是阿里云提供的一种基础云计算服务.使用云服务器ECS就像使用水.电.煤气等资源一样便捷.高效.您无需提前采购硬件设备,而是根据业务需要, ...
- Python小爬虫——抓取豆瓣电影Top250数据
python抓取豆瓣电影Top250数据 1.豆瓣地址:https://movie.douban.com/top250?start=25&filter= 2.主要流程是抓取该网址下的Top25 ...
- 青蛙的约会 POJ - 1061 (exgcd)
两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特 ...
- 启发式合并&线段树合并/分裂&treap合并&splay合并
启发式合并 有\(n\)个集合,每次让你合并两个集合,或询问一个集合中是否存在某个元素. 我们可以用平衡树/set维护集合. 对于合并两个\(A,B\),如果\(|A|<|B|\),那么 ...
- 【HDU - 4340】Capturing a country(树形DP)
BUPT2017 wintertraining(15) #8A 题意 n(<100)个城市组成的树.A攻击i城市需要a[i]代价,B需要b[i].如果一个城市的邻居被A攻击了,那么A攻击它只要A ...
- 【BZOJ4873】[六省联考2017]寿司餐厅(网络流)
[BZOJ4873][六省联考2017]寿司餐厅(网络流) 题面 BZOJ 洛谷 题解 很有意思的题目 首先看到答案的计算方法,就很明显的感觉到是一个最大权闭合子图. 然后只需要考虑怎么构图就行了. ...
- [luogu3391][bzoj3223]文艺平衡树【splay】
题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 分析 ...
- 【php】php实现数组反转
php里面有个函数可以反转数组,工作中也经常用到,非常方便.今天来自己实现这样的功能. $arr = [2,5,6,1,8,16,12]; function reverse($arr){ $left ...