上期作业的答案代码:
二维字符数组
定义一个长度为10的数组,每一个元素是char型
char str[10] = {‘h’,’e’,’l’,’l’,’o’};;
char str[10] = “hello”;
scanf(“%s”,str);
printf(“%s”,str);
定义一个长度为5的数组,该数组中的每一个元素又是一个长度为20的char的数组
char str[5][20] = {{‘x’,’I’,’a’,’n’},{‘h’,’u’,’a’,’q’,’i’,’n’,’g’},{‘b’,’a’,’o’,’j’,’i’},{‘l’,’a’,’s’,’a’},{‘y’,’y’,’d’,’s’}};
char str[5][20] = {“xian”,”huaqing”,”baoji”,”lasa”,”yyds”};
作业:
- 实现字符串的拷贝,不用库函数
- 实现字符串的连接,不用库函数
- 实现字符串的排序
函数
一个独立的功能模块
为什么要使用函数
(1)使程序变得模块化
(2)提高代码的复用率
函数的分类
(1)库函数
a、引入头文件 #include <stdio.h> 、#include <string.h>
b、调用函数
printf();
注意:参数有多少个,数据类型使什么,返回值
函数名(实际参数)
(2)自定义函数(接口)
a、函数定义
存储类型 数据类型 函数名(形式参数列表)
{
函数体;
return返回值;
}
存储类型:auto、register、static、extern
数据类型:函数的返回值(函数的返回值不写默认为int)
函数名:见名知意
形式参数列表:要实现功能所需要的参数,需要调用传入
函数体:功能的具体实现
返回值:若没有返回值,该句话可以省略,并且返回值有且仅有一个
b、函数调用
函数名(实际参数列表);
注意:
- 需要将实参的值传递给形参,实参的个数和数据类型必须和形参一致
- 实参可以是变量、常量,也可以是表达式,必须是一个确定的数
- 实参和形参是两块独立的空间
- 传参数,实际上是将实参的值拷贝给形参
- 形参是局部变量,在函数调用时被定义,函数调用结束时被释放
- 调用时
- 调用结束
- 函数声明
如果不是在main函数之前定义,就需要在main函数之前声明
声明:就是将函数头直接拷贝再加上分号
没加声明之前:
加上声明之后:
编译器根据声明做语法检查
作用:帮助编译器做语法检查
指针
1、概念
指针是一种数据类型,是一种保存地址的数据类型 &+空间的名字
int:是一种数据类型,是一种保存整数的数据类型 8 9 10
float:是一种数据类型,是一种保存浮点数的数据类型 3.12 、2.35
char:是一种数据类型,是一种保存字符的数据类型 ‘A’ , ‘b’
什么是地址
内存分配的最小单位是字节,而每一个字节都有一个编号,我们把这个编号就叫做地址
2、地址的本质:内存单元的编号
3、指针:指针就是地址
4、指针的本质:内存单元的编号(内存单元的编号已经确定了)
5、指针变量
int a;//整型变量
float b;
指针变量:专门用来存放地址(内存单元的编号)的变量
6、定义:
存储类型 数据类型 * 指针变量名;
int * p;
存储类型:auto、register、static、extern
数据类型:指针指向的数据类型
指针的数据类型:int *
& 和 *互为逆运算
思考?
- 地址是什么
- 指针是什么
- 指针变量是什么
- 指针变量怎么定义
- 如何给指针变量赋值
- 指针赋值以后可以干什么
练习:
(1).若有语句int *point, a=4;point=&a;下面均代表a的地址的一组选项是( )
A. a, point,*&a B. &*a, &a,*point
C. &point, *&point, &a D. &a, &*point, point
(2).已有定义int k=2; int*ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行赋值语句的是( )
A. k=*ptr1+*ptr2; B.ptr2=k;
C.ptr1=ptr2; D. k=*ptr1*(*ptr2);
(3).若有说明:int i, j=2,*p=&i;,则能完成i=j赋值功能的语句是( )
A) i=*p; B) *p=*&j; C) i=&j; D) i=**p;
设有以下程序:
(4).main(){ int a, b, k=4, m=6, *p1=&k, *p2=&m;
a=p1==&m;
b=(*p1)/(*p2)+7;printf("a=%d\n",a);printf("b=%d\n",b);
}