C语言第十一章课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4 a[3]
return 0; }
p[4] &a[4]
5 a[4]
指针数组主要用来指向多个字符串,这样 可使字符串的处理更加方便灵活、效率高。
例4 利用字符指针数组处理多个字符串。
#include <stdio.h>
int main( )
char *p[4];
{ char a[ ]="compp[0u]te&r"a,[0b][ ]= "hardwcaorme"pu; ter a
a*[p5[]5]=={1{,&a2[,0p]p[3,[10,]]&4a&&,[1aa5][[10},]];&a[2],
1
&a[3]2,
&aaa[[[401]]] };
for(int i = 0; i p<[25]; &i+a+[2)]
3 a[2]
printf("%d\t",*pp[[3i]])&; a[3]
a[i] p[i]
*(a+i) *(p+i)
下标法 (随机访问好)
指针法 (顺序访问 更快更方便)
对一个数组元素a[i]的地址可以表示为: &a[i]、 &pa[i]、p+i、a+i。
对一个数组元素a[i]的数值可以表示为: a[i]、pa[i]、*(p+i)、*(a+i)。
int a[4]={1,2,3,4};
void* calloc(unsigned int num, unsigned int size);
向系统申请num个size大小的内存块 把首地址返回,若申请不成功则返回NULL
11.4.2动态内存分配函数
void* free(void* p);
释放由malloc()和calloc()申请的内存块 p是指向此块内存的指针 free时系统标记此块内存为未占用,可被重新分配
参分配内存,函数执行结束时,自动释放这些内存
– 从堆上分配
在程序运行期间,用动态内存分配函数来申请的内存都是 从堆上分配的,动态内存的生存期由程序员自己来决定
11.4.2动态内存分配函数
#include <stdlib.h> #include <alloc.h>
void* malloc(unsigned int size);
a+1 &a[1][0] a[1] &a[1][1] a[1]+1 &a[1][2] a[1]+2
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
数组(的)指针
指向数组的指针被称为数组指针,使用数组指针
能很方便地处理二维数组。数组指针的说明形式如下:
存储类型 数据类型 (*指针名)[元素个数];
void* calloc(unsigned int num, unsigned int size);
void*类型的指针可以指向任意类型的变 量,通常强转(Type*)为其他类型
11.4.2动态内存分配函数
void* malloc(unsigned int size);
向系统申请大小为size的内存块 把首地址返回,若申请不成功则返回NULL
形参声明为列数已知的 二维数组
形参声明为指向列数已知 的二维数组的行指针
11.3 指针数组及其应用
一系列有序指针变量的集合组成了指针数组。指针 数组中的每个元素都是指针变量,并且它们具有相同的 存储类型和指向相同的数据类型。与普通数组一样,在 使用指针数组之前,必须先对其定义。指针数组的定义 形式为:
11.4.3 【例11.6】 一维动态数组
n p 确保指针使用前是非空指针
释放向系统申请的存储空间
11.4.3
【例11.6】 一维动态数组
n p
像使用一维数组一样 使用动态数组
Questions and answers
存储类型 数据类型 *指针数组名[元素个数];
指针数组名就表示该指针数组的存储首地址。
例:① int *p[2]; ② int a, *p, b[10], *p1[3];
例3 指针数组举例。
#include <stdio.h>
int main()
int *p[5];
int a[5];
{
int int
char c[ ]= "sofptw[1a] re&"b,[*0]p[4];
hardware b
int i;
p[2] &c[0]
software c
p[0]=a;
p[3] NULL
p[1]=b;
p[2]=c;
运行结果为:
Leabharlann Baidu
数组pf在 字末o[r3程符尾p(]i=r=设序指iN0n置中针Ut;fL(pN数,"U[L%iL组如];L!=s(在果\空Nn初一"/U指/,或Lp始个针[Lpi化数])[);3来;时组]i+=解+的0,;)决长也。度可chsooa不以fmrtdw定把pwauar多,teerre个可以字利符用串在的
int (*p)[3] , i , j ; p=a ; for(i=0 ; i<2 ; i++) { for(j=0 ; j<3 ; j++)
printf("%3d",(*p)[j] ); p++ ; } printf("\n") ; return 0 ; }
11.2 指针和二维数组间的关系
【例11.3】输入一个3行4列的 二维数组,然后输出这个 二维数组的元素值
地址量[整数i]
其含义是访问以地址量为起 点的第i个数据。
a[5] p[5]
*(a+5) *(p+5)
int a[10];
p= &a[0] a a[0] *p a[1] *(p+1)
a[2]
a[3]
p+5
a+5
a[4] a[5] *(p+5)
a[6]
a[7]
a[8i ] *(p+i)
a[9]
从地址的角度来看:
11.2 指针和二维数组间的关系
二维数组看作一维数组,其每个数组元素又是一个 一维数组,按行顺序存放所有元素
short a[2][3];
a[0][0]
a[0] a[0][1]
a
a[0][2]
a[1][0]
a[1] a[1][1]
a[1][2]
a &a[0][0] a[0] &a[0][1] a[0]+1 &a[0][2] a[0]+2
【例11.1】演示数组元素的引用方法
【例11.1】演示数组元素的引用方法
【例11.2】演示数组和指针变量作函数参数
被调函数的形参声明为 数组类型,用下标法访 问数组元素
【例11.2】演示数组和指针变量作函数参数
被调函数的形参声明为 指针类型,用指针法访 问数组元素
一般主函数使用数组名字做实参,被调用函数 使用指针做形参。
首地r址et分ur别n 直0 接; 赋给字符指针数组中的各个元素。
}
11.4.1 C程序的内存映像
C程序中变量的内存分配方式
– 从只读存储区,分配只读的程序和数据 – 从静态存储区分配
全局变量和静态变量
– 在栈上创建
存放函数参数值、局部变量值等 在执行函数调用时,系统在栈上为函数内的局部变量及形
用指针完成数组元素的输入和输出。
for (i=0; i<4; i++) scanf("%d", &a[i]);
for (i=0; i<4; i++) printf("%d ", a[i]);
for (p=a; p<(a+4); p++) scanf("%d", p);
for (p=a; p<(a+4); p++) printf("%d ", *p);
….
a
0x0037b000
pa
1
0x0037b004
2
0x0037b008
3
0x0037b00B
4
a[0] a[1] a[2] a[3]
…...
int *pa=a; int *pa=&a[0];
数组名是一个常量指针 不能修改该指针的指向
指针可当数组名使用,可 以更改指针的指向
11.1 指针和一维数组间的关系
例如:int (* p)[3];
int (*p)[3];
p
(*p)[0] (*p)[1] (*p)[2]
注意:
数组指针
① *p两侧的括号一定不要漏掉。
② p是一个行指针,它只能指向一个含若干元素的一维数组 (其值为该一维数组的首地址) 。
例 利用数组指针处理二维数组。
#include <stdio.h> int main( ) { int a[2][3]={ 1,2,3,4,5,6 };
第11章 指针和数组
本章学习内容
指针与一维数组间的关系, 指针与二维数组间的关系 向函数传递一维数组和二维数组 指针数组,命令行参数 动态数组,动态内存分配
1 指向数组的指针
在C语言中,a[i]也是一个运 算表达式,其运算符就是下 标运算符[],也称为访问数 据运算,它是第一优先级的 运算。访问数据运算表达式 的一般形式是: