C语言详解指针和数组.ppt
《C语言详解指针和数组.ppt》由会员分享,可在线阅读,更多相关《C语言详解指针和数组.ppt(65页珍藏版)》请在三一办公上搜索。
1、再论指针和数组,附录一,预习检查,链表单元有哪几个部分组成如何申请链表单元,及释放链表单元实现单链表插入的基本语法简述一下快速排序基本理论要点,课程目标,本章概述指针与数组什么时候相同C语言为什么把数组参数当作指针C语言的多维数组,及如何创建动态数组。本章目标 掌握指针什么时候和数组相同,以为容易混淆的原因掌握多维数组的内存布局。使用指针向函数传递多维数组参数使用指针返回多维数组使用指针创建和使用动态数组重点 指针和数组混淆的原因指针传递多维数组参数难点 指针和数组混淆的原因创建和使用动态数组,本章结构,指针与数组不相同,再论指针和数组,指针数组和数组指针,指针与数组相同,函数指针和指针函数,
2、怎样使用数组,指针运算,1 再论指针和数组,指针与数组的不相同 指针与数组的相同 怎样使用指针 指针运算 函数指针和指针函数指针数组和数组指针,1.1 指针与数组的不相同,数组和指针是如何访问的 数组访问指针数据 使声明与定义相匹配 数组和指针的其他区别,1.1.1数组和指针是如何访问的,申明区别extern int*x;声明x是个int型的指针 extern int y y是个int型数组,长度尚未确定 地址和内容的区别,1.1.1数组和指针是如何访问的,数组下标引用特点地址在编译时可知 直接进行操作 例:数组:char a9“abedefgh”;.取值:c=ai,编译器符号表具有一个地址9
3、980,运行步骤:取i的值,将它与9980相加取地址(9980i)的内容。,图A,1.1.2 数组访问指针数据,指针访问特点必须首先在运行时取得它的当前值 间接进行操作 例:指针:char*p取值:c=*p,编译器符号表有一个符号p,它的地址为4624,运行步骤:取地址4624的内容,就是5081 取地址5081的内容。,5081,4642,图B,1.1.2 数组访问指针数据,数组访问指针特点对内存进行直接的引用转化为间接引用例:数组:char a9“abedefgh”;.取值:c=ai,编译器符号表有一个符号p,它的地址为4624,运行步骤:1.取地址4624的内容,即5081。2.取得i的
4、值,并将它与5081相加。3.取地址508l+i的内容。,5081,4642,5081+i,图C,1.1.2 数组访问指针数据,指针访问特点char*p=“abcdefgh”;p3 dchar a=”abcdefgh”;a3 d访问特点取得符号表中P的地址,提取存储于此处的指针。把下标所表示的偏移量与指针的值相加,产生一个地址。访问上面这个地址,取得字符。,1.1.3 数组和指针的其他区别,1.2 指针与数组的相同,什么时候指针与数组相同 混淆的原因数组和指针规则为什么C语言把数组形参当作指针 数组与指针归纳总结,1.2.1 什么时候指针与数组相同,数组运用特性数组声明外部数组(externa
5、l array)的声明 数组的定义 函数参数的声明 运用特性作为函数参数的数组名可以通过编译器转换为指针使用数组时,数组可以写成指针,可以互换,1.2.1 什么时候指针与数组相同,数组与指针编译器处理时是不同的 一个数组就是一个地址 一个指针就是一个地址的地址 在运行时的表示形式也是不一样的 可能产生不同的代码,1.2.2 数组和指针混淆的原因,分析:,char my _array10char*my_ptr;.j=strlen(my_array);J=strlen(my_ptr);printf(”s s”,my_ptr,my_array);,1.2.2 数组和指针混淆的原因,数组和指针是相同的
6、规则表达式中的数组名(与声明不同)被编译器当作一个指向该数组第一个元素的指针1。下标总是与指针的偏移量相同在函数参数的声明中,数组名被编译器当作指向该数组第一个元素的指针,1.2.3 数组和指针规则,“表达式中的数组名”就是指针 C语言把数组下标作为指针的偏移量“作为函数参数的数组名”等同于指针,1.2.3.1“表达式中的数组名”就是指针,数组下标的引用一个指向数组的起始地址的指针加上偏移量”下标值的步长调整到数组元素的大小 整型数的长度是4个字节,那么ai+1和ai在内存中的距离就是4(而不是1)例:访问ai:int a10;int*p;Int i=2;,p=a;pi;,p=a;*(p+i)
7、;,p=a+i;*p;,访问数组第i个元素的三张方式,1.2.3.1“表达式中的数组名”就是指针,数组的引用不能用指向该数组第一个元素的指针规则数组作为sizeof()的操作数一显然此时需要的是整个数组的大小,而不是指针所指向的第一个元素的大小。使用&操作符取数组的地址。数组是一个字符串(或宽字符串)常量初始值。,1.2.3.2 C语言把数组下标作为指针的偏移量,数组访问模式分析数组访问,1.2.3.2 C语言把数组下标作为指针的偏移量,数组访问模式分析指针备选方案1,1.2.3.2 C语言把数组下标作为指针的偏移量,数组访问模式分析指针备选方案1,1.2.3.2 C语言把数组下标作为指针的偏
8、移量,数组访问模式分析指针备选方案,1.2.4 为什么C语言把数组形参当作指针,数组运用特性数组声明外部数组(external array)的声明 数组的定义 函数参数的声明,1.2.4 为什么C语言把数组形参当作指针,出于效率的考虑?传值调用与传址调用 C语言形参特性非数组形式的数据实参均以传值形式 拷贝整个数据拷贝整个数组,在时间上还是在内存空间上的开销都非常大 所有的数组在作为参数传递时都转换为指向数组起始地址的指针,而其他的参数均采用传值调用 函数的返回值绝不能是一个函数数组,而只能是指向数组或函数的指针,1.2.4 为什么C语言把数组形参当作指针,例:,展示了对一个下标形式的数组形参
9、进行访问所需要的几个步骤。Func(char p);c=pi Func(char*p);c=pi编译器符号表显示p可以取址,从堆栈指针sp偏移14个位置运行时步骤1:从sp偏移14个位置找到函数的活动记录,取出实参。步骤2:取i的值,并与5081相加。步骤3:取出地址(508i)的内容。,1.2.4 为什么C语言把数组形参当作指针,数组,指针实参的一般用法,1.2.5 数组与指针归纳总结,用ai这样的形式对数组进行访问总是被编译器“改写”或解释为像*(a+1)这样的指针访问。指针始终就是指针。它绝不可以改写成数组。在特定的上下文中,也就是它作为函数的参数(也只有这种情况),一个数组的声明可以看
10、作是一个指针。作为函数参数的数组(就是在一个函数调用中)始终会被编译器修改成为指向数组第一个元素的指针。当把一个数组定义为函数的参数时,可以选择把它定义为数组,也可以定义指针。不管选择哪种方法,在函数内部事实上获得的都是一个指针。定义和声明必须匹配,1.3 怎样使用数组,多维数组向函数传递一个多维数组从函数返回一个数组,1.3.1 多维数组,多维数组特性多维数组内存布局如何分解多维数组 如何对数组进行初始化,1.3.1.1 多维数组特性,定义和引用多维数组惟一的方法就是使用数组的数组 注意:ijk 与I,j,k多维数组看作是一种向量 多维数组的定义声明一个1020的多维字符数组 char ca
11、rrot1020;或者声明一种看上去更像“数组的数组”形式:typedef char vegetable20;vegetable carrot10;不论哪种情况,访问单个字符都是通过carrotij的形式,编译器在编译时会把它解析为*(*(carrot+i)+j)的形式,1.3.1.2 多维数组的内存布局,多维数组内存布局pea12的内存表示:线性存储表达式为:*(*(pea+i)+j),Pea0,Pea1,Pea1,Pea1,Pea0123,Pea12,1.3.1.3 如何分解多维数组,分解特点:多维数组是如何分解为几个单独的数组的多维数组每一个单独的数组都可以看作是一个指针 不能把一个数组
12、赋值给另一个数组 多维数组分解int apricot235 sizeof(apricot)区域sizeof(apricoti)sizeof(apricotij)sizeof(apricotijk),1.3.1.4 如何对数组进行初始化,嵌套的花括号进行初始化多维数组如short cantaloupe25=10,12,3,4,一5,31,22,6,0,-5,;如int rhubarb3=0,0,0,1,1,1,;,1.3.1.4 如何对数组进行初始化,建立指针数组进行初始化多维数组如如,只有字符串常量才可以初始化指针数组 指针数组不能由非字符串的类型直接初始化 int*weights=1,2,3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 详解 指针 数组
链接地址:https://www.31ppt.com/p-6504330.html