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