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赋值 。*/