c语言课件(8)[下学期]

文档属性

名称 c语言课件(8)[下学期]
格式 rar
文件大小 160.8KB
资源类型 教案
版本资源 通用版
科目 信息技术(信息科技)
更新时间 2005-11-12 08:46:00

图片预览

文档简介

(共31张PPT)
指针
第八章
回顾
数组的存储机制
数组的定义和使用
数组的初始化
二维和多维数组
目标
理解指针的意义
掌握指针变量和指针运算符的使用
掌握指针与数组的关系
掌握内存分配
什么是指针?
指针是一个变量,它包含另一个变量的内存地址
使用指针可以间接访问数据项的值
指针可以指向基本数据类型的变量(如 int、char和double等) 或者数组
指针可以用来做什么?
从函数中返回多个值
从一个函数向另一个函数传递数组和字符串
通过移动指针操作数组
分配内存并对其进行访问
指针变量
指针声明包括类型和变量名,变量名的前面有一个 *
type *name;
例如:
int *var2;
var2
指针运算符
&是一元运算符,它返回操作数的内存地址
var2 = &var1;
*是 &的反运算符,它也是一元运算符,返回指针指向的内存位置中的值
temp = *var2;
给指针赋值 2-1
通过 & 运算符为指针赋值
ptr_var = &var;
通过另一个指向相同类型数据项的指针变量对指针进行赋值
ptr_var2 = ptr_var;
给指针赋值 2-2
通过指针为变量赋值
*ptr_var = 10;
如果ptr_var指向var,则把10赋给var
指针运算 2-1
只能进行加法和减法运算
int var, *ptr_var;
ptr_var = &var;
ptr_var ++;
假定var存储在地址1000中,因为整数的长度是 2 个字节,ptr_var的值将是1002
指针运算 2-2
指针递增时,将指向其类型的下一个元素的内存位置,反之亦然
操作 意义
++ptr_var或ptr_var++ 指向 var 后面的下一个整数
--ptr_var或ptr_var-- 指向 var 前面的整数
ptr_var + i 指向 var 后面的第 i 个整数
ptr_var - i 指向 var 前面的第 i 个整数
++(*ptr_var)或(*ptr_var)++ 将 var 的值加 1
*(ptr_var++) 取出 var 后面的下一个整数的值
指针比较
前提:两个指针都指向相同类型的变量
假设ptr_a和ptr_b分别指向a和b
操作 意义
ptr_a < ptr_b 如果a存储在b的前面则返回true
ptr_a <= ptr_b 如果a存储在b的前面,或两个指针指向同一位置则返回true
ptr_a == ptr_b 如果两个指针指向同一位置则返回true
ptr_a != ptr_b 如果两个指针指向不同位置则返回true
ptr_a == NULL 如果ptr_a是空值则返回true
指针与一维数组 3-1
数组元素的地址可以用两种方式表示
在数组元素前面加“&”符号
&ary[2]
数组名 + 下标
ary + 2
指针与一维数组 3-2
#include
void main()
{
static int ary[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int i;
for (i = 0; i < 10; i ++)
{
printf("\ni=%d,ary[i]=%d,*(ary+i)=%d",i,ary[i],*(ary + i));
printf("&ary[i]= %X,ary+i=%X",&ary[i],ary+i);
}
}

地址
指针与一维数组 3-3
演示:
执行程序,观察并分析输出结果
指针与多维数组
二维数组可以定义为一个指向一组连续的一维数组的指针
data_type (*ptr_var) [expr];
指针与字符串 2-1
#include
#include
void main ()
{
char a, str[81], *ptr;
printf("\nEnter a sentence: ");
gets(str);
printf("\nEnter character to search for:");
a = getche();
ptr = strchr(str,a);

printf("\nString starts at address: %u",str);
printf("\nFirst occurrence of the character is at: %u",ptr);
printf(“\nPosition of first occurrence is: %d”,ptr-str);
}
指针运算
指针与字符串 2-2
演示:
执行程序,观察并分析输出结果
分配内存 2-1
malloc() 是最常用的函数之一
它允许从空闲内存池中分配内存
malloc() 的参数是代表所需字节数的整数
分配内存 2-2
#include
#include
void main() {
int *p,n,i,j,temp;
printf("\n Enter number of elements in the array: ");
scanf("%d",&n);
p=(int*)malloc(n*sizeof(int));
for(i=0;iprintf("\n Enter element no. %d: ",i+1);
scanf("%d",p+i);
}
for(i=0;ifor(j=i+1;jif(*(p+i)>*(p+j)) {
temp=*(p+i);
*(p+i)=*(p+j);
*(p+j)=temp;
}
for(i=0;iprintf("%d\n",*(p+i));
}
分配内存
排序
free()函数 3-1
使用 free() 函数释放不再需要的内存
void free(void *ptr);
ptr 必须是通过malloc()、calloc()或realloc()分配的指针
free()函数 3-2
#include
#include
int main() {
int number;
int *ptr;
int i;
printf("How many ints ");
scanf("%d", &number);
ptr = (int *) malloc (number*sizeof(int));
if(ptr!=NULL)
{
for(i=0 ; i{
*(ptr+i) = i;
}
for(i=number ; i>0 ; i--)
{
printf("%d\n",*(ptr+(i-1)));
}
free(ptr);
return 0;
}
else
{
printf("\nMemory allocation failed.\n");
return 1;
}
}
定义
分配
判断
释放
free()函数 3-3
演示:
执行程序,观察并分析输出结果
calloc()函数 3-1
calloc()与malloc()类似
主要的区别是存储在已分配的内存空间中的值默认为零
calloc()需要两个参数
要分配内存的变量的个数
每个变量的大小
void *calloc( size_t num, size_t size );
calloc()函数 3-2
#include
#include
int main() {
float *calloc1, *calloc2;
int i;
calloc1 = (float *) calloc(3, sizeof(float));
calloc2 = (float *)calloc(3, sizeof(float));
if(calloc1!=NULL && calloc2!=NULL) {
for(i=0 ; i<3 ; i++) {
printf("\ncalloc1[%d] holds %05.5f ", i, calloc1[i]);
printf("\ncalloc2[%d] holds %05.5f ", i, *(calloc2+i));
}
free(calloc1);
free(calloc2);
return 0;
}
else {
printf("Not enough memory \n");
return 1;
}
}
定义
分配
判断
释放
calloc()函数 3-3
演示:
执行程序,观察并分析输出结果
realloc()函数 3-1
为已经分配的内存重新分配空间并复制内容
realloc()函数有两个参数
已分配的内存地址
重新分配的字节数
void *realloc( void *ptr, size_t size );
realloc()函数 3-2
#include
#include
int main()
{
int *ptr;
int i;
ptr = (int *)calloc(5, sizeof(int *));
if(ptr!=NULL)
{
*ptr = 1;
*(ptr+1) = 2;
ptr[2] = 4;
ptr[3] = 8;
ptr[4] = 16;
ptr = (int *)realloc(ptr, 7*sizeof(int));
if(ptr!=NULL)
{
ptr[5] = 32;
ptr[6] = 64;
for(i=0;i<7;i++)
{
printf(“ptr[%d]:%d\n", i, ptr[i]);
}
realloc(ptr,0);
return 0;
}
定义
分配
判断
释放
再分配
realloc()函数 3-3
演示:
执行程序,观察并分析输出结果
总结
如何使用指针变量和指针运算符
指针赋值
指针运算
指针比较
指针与数组
内存分配
同课章节目录