1 C语言复习 C 语 言 复 习 2 指针的概念 ? 指针是存放内存地址的变量;必须说明 指针变量的数据类型;任何类型的指针 变量都是 2 个字节。 int x , *p , a[10]; float d; p=&x; *p=5 ; /* x = 5 */ p= a ; /* 数组名是数组空间的首址 */ p++; *p= 78 ; /* a[1] = 78 */ p = p +5;*p = 900; /* a [6] = 900 */ p=&d ; /* 错 ,类型不匹配 */ 2 C 语 言 复 习 3 指针和结构体 struct List{ int data; int length ; int size ; } L ; /* & 是取变量地址的操作符 */ struct List *p =&L; L.data=23; /* p→data=23; */ p →length=30; /* L.length=30 */ p →size=100; /* L . Size = 100 */ C 语 言 复 习 4 指针与数组 ? 数组名是地址常数,指针是地址变量; ? 在操作上有很多相同之处: int A[10] , *p ; p=A; p=&A[0]; *p=11; *(p+1)=20; *(p+9)=50; *A=11; *(A+1)=20; *(A+9)=50; A[0]=11; A[1]=20; A[9]=50; p[0]=11; p[1]=20; p[9]=50; ? 指针的移动: p++; *p=20; p= p+8; *p=50; p = p - 5 ; *p = 37; /* A[4] */ 3 C 语 言 复 习 5 sizeof (类型名)运算符 ?sizeof ( int ) 计算结果是数值 2; ?sizeof (char ) 计算结果是值 1; ?sizeof ( double) 计算结果是数值 8; ?sizeof ( float) 计算结果是数值 4; ?struct datlem{ char name [ 20 ]; int age; char sex; }; sizeof (struct datlem)计算结果是 23; C 语 言 复 习 6 动态申请存储空间函数malloc ( 字节数) ? 返回值:是所申请的 存储块首址 (无类 型 ); ? 返回值的强制类型转换:将 malloc的返回值 强制转换成某种数据类型的指针。 int *p; p = (int *)malloc(20); ? 字节数:数据元素个数 *sizeof (类型 ) struct datlem *pd; pd=(struct datlem*)malloc(5*sizeof(struct datlem)); if pd = = NULL /*系统已没有足够的内存资源 4 C 语 言 复 习 7 释放动态申请的存储空间函数free ( 存储块首址) free(pd); ?当动态申请的存储空间不再使用时, 必须 还给 系统; ?必须妥善保存 malloc的返回值,否则, 无法释放动态申请的存储空间,从 而造成内存资源丢失。 ?注意: 在整个程序运行结束之前, 释放所有动态申请的存储空间。 C 语 言 复 习 8 重新定义类型名语句typedef 原类型名新类型名; ? typedef int ElemType; ElemType e , *p ; /*等同于 int e , *p ; */ p=(ElemType*)malloc(9*sizeof (ElemType)); ? typedef struct datlem ElemType; typedef ElemType * Ep ; /*指针类型名 */ ElemType e ; /* struct datlem e ; */ Ep p ; /* ElemType *p;或 struct datlem *p; p=( Ep )malloc(90*sizeof (ElemType)); 5 C 语 言 复 习 9 结构定义与typedef 一起使用 typedef int EType; /*使 EType 是合法的数据 typedef struct List{ 类型名 */ EType *elem ; int length ; int size ; } SqList ; /*使 SqList 是合法的结构体类型名 */ SqList L; L. elem=(EType*)malloc( 90 *sizeof (EType)); L . size = 90 ; L. length=0; C 语 言 复 习 10 子程序及参数传递 ? 子程序只能有一个返回值,由 return(x); 语句完成;可以有多个参数, ? 参数传递:在子程序调用时,系统自动 将实参 数值 拷贝到行参 变量 中; (包括指针类型和普通变量) 注意:一一对应、类型匹配 ? 一维数组型参数等同于指针类型参数; ? 一般来说,结构体数据的传递通过指针 完成。 6 C 语 言 复 习 11 格式化输入语句scanf ? 语句格式: scanf ( “格式串 ”, 地址 1 ,地址 2 ,···); ? 格式串: %d , %c , %f , %s ? 地址:是存放输入数据的存储单元地址; ? 例如: int max; scanf( “%d ”, &max ); C 语 言 复 习 12 算法描述中的引用型参数 #define OK 1 #define ERROR 0 /*指针类型参数 */ #define OVERFLOW -2 typedef int Status ; Status InitList_Sq ( SqList &L){ L. elem=(EType*)malloc( 90 *sizeof (EType)); if ( ! L.elem ) exit ( OVERFLOW); L . size = 90 ; L. length=0; return ( OK ); } /* 以 & 打头的参数即为引用型参数,可以理解为: L是实参变量的别名,和实参是同一个变量。*/ 7 C 语 言 复 习 13 /* 在 C语言中,指针类型参数是子程序使用主调函数 中存储区的 唯一途径 。 */ Status InitList_Sq ( SqList *L){ L →elem=(EType*)malloc( 90 *sizeof (EType)); if ( ! L →elem ) exit ( OVERFLOW); L →size = 90 ; L →length=0; return ( OK ); } main( ) { SqList X; initList_Sq( &X ); } /* 以 * 定义 的参数是指针类型参数, L是指向 主调 函数中 SqList类型的变量 X,通过 L对 X赋值 。*/