C语言进阶--DAY3

时间:2023-01-09 17:26:00

主要讲解数组和指针有关问题

1. 数组名的本质是一个常量指针

2. 内存编址的最小单位是字节,对于变量来说,一个变量可以取1、2、4、8等字节,对变量取地址来说,取的是低位字节的地址,在32位机中其对变量取地址就是4,不管其占几个字节。如下例

C语言进阶--DAY3

经过分析我们可以得出:指针的大小为4

3. 指针的本质:一个有类型的地址

C语言进阶--DAY3

以上实验说明指针是一个有类型的地址,常量指针

4. int p中,*号起的作用是指针的声明以及指定大小,类型决定寻址能

对于这个*号,注意如下的情况

int *p=&data;(1)

printf(“%x\n”,*p);(2)

(1)(2)两处的*是不一样的,(1)处的是指针的声明,(2)处的于与&data之间的引用和解引用的关系

5. 指针的运算,指针的+1和数值的+1是不一样的,观察下列程序

C语言进阶--DAY3

输出结果分别为:0x15,  -5,  5

注意到第一个输出结果是指针的相加,步长为4,后两个为数值的加减,步长为1

6. 数组名作为成员访问的时候就是一个一级指针, &  和 * 实现了一级指针(数组名)到数组指针之间的切换

C语言进阶--DAY3

输出的结果为:

arr       = 0xbffd24dc

arr+1     = 0xbffd24e0

&arr      = 0xbffd24dc

&arr+1    = 0xbffd24f0

*&arr     = 0xbffd24dc

*&arr+1   = 0xbffd24e0

7. 为了帮助理解数组在内存中的线性存储,做以下练习

C语言进阶--DAY3

由已学知识,数组在内存中的存储如下

C语言进阶--DAY3

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*表示此指向类型是一个指针类型

通过二级指针,实现了对数据空间的间接访问,如下所示

C语言进阶--DAY3

通过二级指针,可以改变一级指针的指向问题,见下列例子

C语言进阶--DAY3

注意:想要改变指针指向的内容,就必须要传递指针的地址,因此会出现二级指针

通过一级指针可以改变0级指针指向问题

通过二级指针可以改变一级指针指向问题

通过三级指针可以改变二级指针指向问题

8. 通过对二级指针,改变了一级指针的指向问题,也叫对一级指针的初始化问题

C语言进阶--DAY3

如上所见,指针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 *

由于在数组中我们常常用指针来进行访问,因此我们想用指针来访问指针数组

类比利用一级指针对数组进行访问,可以得出利用指针对指针数组的访问

C语言进阶--DAY3

对于char *  *p=pa来说,pa 相当于&pa[0]à&char *àchar **即为一个二级指针

pa和**p完全等价的原因:

C语言进阶--DAY3

其中箭头代表指向关系

pa代表指针数组的首元素地址,pa+1每次加4,char*+1也是每次加4,在图中表示一个单元格的范围

同时,由于p=pa,因此pa[1]代表的地址为0x14c0b,p[1]代表的地址也是0x14c0b

C语言进阶--DAY3的更多相关文章

  1. 【R笔记】R语言进阶之4:数据整形(reshape)

    R语言进阶之4:数据整形(reshape) 2013-05-31 10:15 xxx 网易博客 字号:T | T 从不同途径得到的数据的组织方式是多种多样的,很多数据都要经过整理才能进行有效的分析,数 ...

  2. 《C语言进阶剖析》课程目录

    <C语言进阶剖析>学习笔记                                                         本文总结自狄泰软件学院唐佐林老师的<C语言 ...

  3. R语言进阶

    一.初学入门:<R in Action><The Art of_R Programming>入门者可首选两本,前者从统计角度入手,分高中低三部分由浅入深的讲解了如何用R来实现统 ...

  4. C 语言 进阶

    清单狂魔,只挖坑不填坑.. 前言 最近经常被询问 C 语言 相关的问题,突然便也觉得需要思考一下 C 语言的进阶了. 我用 C 语言写过的最大的一个项目,也只是那个贪吃蛇,后来就断断续续地用 Pyth ...

  5. 编程C语言进阶篇——自定义数据类型:共同体

    什么是"自定义数据类型"?顾名思义,就是用户可以随时在程序中自行定义新的数据类型.自定义数据类型时需要设置数据类型的名称及其成员.数据类型成员各属性的设置方法等同于变量设置时相应属 ...

  6. 编程C语言进阶篇——自定义数据类型:结构体

    一.结构体 定义方法: 结构名 变量名 特点: 两个同类型的结构变量可以相互赋值,但是结构变量之间不能使用"<","=="等运算符,如果使用则需要对运算符 ...

  7. 苹果新的编程语言 Swift 语言进阶(六)--函数和闭包

    一 .函数 1.1. 函数的定义和调用 函数的定义以funckeyword作为前缀,接着是函数名字,接着跟着一个能够带有參数.也能够不带參数的圆括号.接着用-> 指示函数的返回类型. 函数运行体 ...

  8. 苹果新的编程语言 Swift 语言进阶(五)--控制流

    Swift 语言支持C语言全部的控制语句.包含for  和while循环语句,if和switch条件语句,以及break和continue控制语句等. Swift 语言除了支持以上语句,还添加了一个f ...

  9. 苹果新的编程语言 Swift 语言进阶(十二)--选项链

    选项链是使用选项来查询和调用其属性.方法或下标的一个过程,假设选项包括一个值,则属性.方法.下标的查询和调用成功,否则,调用返回nil. 选项链能用在不论什么类型的选项来检查对其一个属性.方法.下标的 ...

随机推荐

  1. IOS开发之Bug--View是懒加载导致出误以为是UI加载的bug

    虽然分类为bug,但也算的上是一个问题,一个很简单的问题.先来看看问题的重现,就写了简单的Demo验证效果: 问题:点击ViewController跳转到TwoViewController,发现会延迟 ...

  2. eclipse导入项目后,java文件无法编辑的问题

    新公司第一天,从svn checkout maven项目后,导入eclipse,发现文件的图标不对,如下图箭头所示,出现这个问题的原因, 是项目的的目录下没有.classpath文件,所以需要执行下m ...

  3. &lbrack;ACM&lowbar;数学&rsqb; 大菲波数 &lpar;hdu oj 1715 &comma;java 大数)

    大菲波数 Problem Description Fibonacci数列,定义如下:f(1)=f(2)=1f(n)=f(n-1)+f(n-2) n>=3.计算第n项Fibonacci数值.   ...

  4. Http协议之Request和Response

    GET / HTTP/1.1表示向服务器用GET方式请求首页,使用HTTP/1.1协议 Cache-Control作用: 用来指定Response-Request遵循的缓存机制.各个指令含义如下Cac ...

  5. iOS 如何进行逆向工程

    原文:http://www.zhihu.com/question/20317296 季逸超,Peak-Labs创始人/CEO,猛犸浏览器.Rasgue- 有幸被邀请回答,不过不知道您要了解的'系统机制 ...

  6. Java多线程编程总结(学习博客)

    Java多线程编程总结:网址:http://lavasoft.blog.51cto.com/62575/27069/

  7. 移动端高清、多屏适配方案——rem

    背景: 开发移动端H5页面 一套设计图 不同尺寸的手机 不同分辨率的手机 方案:使用rem作为单位解决一套设计图适应不同分辨率,不同尺寸的手机. 概念: REM(font size of the ro ...

  8. java&period;lang&period;IllegalArgumentException&colon; Mapped Statements collection does not contain value for com&period;bjsxt&period;mapper&period;PeopleMapper

    报错信息: Type Exception Report Description The server encountered an unexpected condition that prevente ...

  9. 【Nodejs】ExpressのRequestとResponseの内容

    Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性.常见属性有: req.app:当callback为外部文件时,用req.ap ...

  10. 零基础学Cocos2d-X 3&period;0 - 04

    忙完两个项目后.最终有时间继续学习Cocos2d-X 了. 常听人说.Cocos2d-X 有四个类是最经常使用的,包含: Director 类----> 导演 Scene 类 -----> ...