数组
-
数值的默认赋值
#include"stdio.h"
//1,把数组和变量放在全局变量默认赋值为0
int a;
int num[100];
int main()
{
//2,对部分赋值,其余默认赋值为0
int num_1[10]={0};
int num_2[10][10]={0};
//输出
printf("%d\n",a);
printf("%d\n",num[66]);
printf("%d\n",num_1[4]);
printf("%d\n",num_2[4][4]);
return 0;
}
输出结果:
-
字符串数组
- gets(字符串名) 获得字符串 - puts(字符串名) 输出字符串且换行
注:使用gets 和 scanf 时会产生异常
当在scanf()后面使用gets()时,程序直接逃过gets()函数。直接跳过的原因是,在结束前一个scanf输入时输入的回车被后一个gets输入时接受,也就是说前一个地方输入的“数据+回车”分别被两个地方接受。gets()遇到前面scanf()输入的回车时停止接收,gets()中的输入缓冲区没有数据。sanf()和gets()先后一起使用时会给造成一种似乎gets()没有被执行的假象。
其他需要记住的函数:
strcpy(s1, s2);
复制字符串 s2 到字符串 s1。
strcat(s1, s2);
连接字符串 s2 到字符串 s1 的末尾。
strcmp(s1, s2);
如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回
大于 0。
指针
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。
-
定义:指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
type *var-name;
eg,
int *p=NULL;
也就是说,指针储存的数据是数据的地址,而不是数据的值
- & 与 *
& 取地址符,用于获取变量的地址
* 解引用运算符,它的操作数必须是指针类型,用来获取指针指向变量的内容
int value=3;
//得到value的地址
int *arrow=&value;
printf("%d\n",arrow);
printf("%d\n",*(arrow));
- 地址的运算
请看下面的代码,如果a的值等于10,以下的输出会是多少?
int a[9] = { 0 };
printf("%d\n", a);
printf("%d\n", (a + 1));
printf("%d\n", (a + 2) - a);
·
·
·
·
·
·
·
·
·
·
·
·
·
c语言标准中有如下规定:
当一个加法运算,加号左边的操作数是一个指针,而右边的操作数是一个整数时,这个整数值先乘以指针类型的大小(sizeof(int)),然后再加到左边的数上。
当同一个数组的两个成员的指针相减时,其差值为:地址值的差,再除以一个数组成员的size。这个结果代表了两个指针对应元素的下标之差。
函数
函数的组成
1,返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
2,函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
3,参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
4,函数主体:函数主体包含一组定义函数执行任务的语句。形参与实参
形参(形式参数):在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
实参(实际参数):数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。
int maxs(int a, int b)//括号里面就是形参。调用时获得内存,函数结束时释放内存
{
if (a > b)
return a;
else
return b;
}
printf("maxs函数的值为:%d\n", maxs(10, 111));//10和111就是实参
- 函数书写顺序
- 值传递和地址传递(重点掌握)
结构体
- 定义:C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(structre)。
结构体类型的名字是由一个关键字 struct 和 结构体名 组合而成的。结构体名由用户指定,又称“结构体标记”(structure tag) 。
花括号内是该结构体所包括的子项,称为结构体的成员(member)。对各成员都应进行类型声明,即
“成员表列”(member list)也称为“域表”(field list),每一个成员是结构体中的一个域。成员名命名规则与变量名相同。
- 使用typedef来声明新的变量
typedef struct studentlist {
int id;
char name[10];
int num[20];
struct studentlist *next;
}student;
声明之后就可以使用变量名来进行定义
student *p, *q,*head;
- 结构体数组
- . 和 ->的区别
链表
链表是物理存储单元上非连续的、非顺序的存储结构,由一系列结点组成。
- 创建顺序:
1.使用malloc()函数来为结点开辟空间,并把当前开辟结点的next指针指向为空
p = (student *)malloc(sizeof(student));
p->next = NULL;
2.用一个新的该类型指针指向创建好的结点,接着创建新的结点
注:学会链表关键在于了解链表创建时的步骤,知道如何确定结点之间关系
作业
- 以当前结构体为例,实现链表的创建,增加,删除功能,每使用一种功能之后,遍历输出结点的id,名字。
增加:可以指定在第几个结点之后插入新的结点
删除:用户输入学生名字,删除对应学生名字的结点