数据结构的C基础

1.计算机程序:对数据进行加工,处理。一个程序应包括对数据的描述(数据结构——C语言中,以数据类型的形式出现)和对数据处理的描述(算法——以语句序列实现)

一、数据类型

1.基本数据类型:整型(int),实型(float,double),字符型(char)
2.构造类型:数组,结构体
3.指针

二、数据的值有两种表示形式

常量:
\qquad 直接常量(常数)——整型、实型、字符、字符串
\qquad 符号常量(宏名)——# define 标识符 常量
变量: 具有五个要素——名称,数据类型,取值大小,内存地址,值

注意:字符常量是以单引号括起的单个字符,占1个字节;字符串是用双引号括起来的字符序列,字符串以空字符’\0’作为结束标志。注意区分C和其他编程语言的语法。
注意: 逻辑与关系运算中,非0表示真,0表示假

三、运算符、表达式、控制语句

数据的类型转换:
隐式转换:运算转换,赋值转换,输出转换
强制类型转换:(要转换成的数据类型) 被转换的表达式 ,当表达式不是一个简单的表达式时要加上括号

控制语句: 用于控制程序的执行流程,共9种,可分为:
1.选择语句 : i f . . . e l s e , s w i t c h :if...else, \quad switch :if...else,switch
2.循环语句 : f o r , w h i l e , d o . . . w h i l e :for,\quad while,\quad do...while :for,while,do...while
3.辅助语句 : c o n t i n u e , b r e a k , g o t o , r e t u r n :continue,\quad break,\quad goto,\quad return :continue,break,goto,return
控制结构:顺序结构,选择结构,循环结构

//switch语句——开关语句
switch(表达式)   //执行和switch的表达式值相同的常量表达式对应的语句,直至break,或遇到结束符'}'
{
case 常数表达式1:语句1; [break;]
case 常量表达式2:...
...
[default: ...]
}
//do while
do
	... //循环体
while(表达式);

注意区别breakcontinue

四、输入与输出

C语言的所有输入输出操作都是通过调用标准输入输出库函数来完成的。在使用标准库函数时,用户要用预编译命令#include将相应的头文件包含到源文件中,头文件中包含了调用函数所需要的相关信息。则调用输入输出函数时,需要#include<stdio.h>#include"stdio.h"

1.格式化输出函数printf,一般形式如下:

printf(格式控制,输出项)
/*
输出项是表达式,当有多个输出项时,各输出项之间用逗号分隔
格式控制:双引号括起来的字符串,包含:
1.普通字符和转义字符:按原样输出到显示器上;
2.输出格式说明,一般形式:%[<修饰符>]<格式字符>     //[]内的东西表示可有可无,即可选
其中格式字符用于指定输出数据按何种形式输出(d:十进制整数,f:实型,s:字符串,c:字符)
修饰符用于指定输出数据所占的宽度、对齐方式以及保留的小数位数等。
*/
int a=1;
float b=3;
char c=65;
printf("%d%f%c",a,b,c);
printf("%s","wjkwy");//%s逐个输出字符,知道遇到'\0'字符结束标志

2.格式化输入函数scanf,一般形式如下:

scanf(格式控制,地址列表);
/*
格式控制和printf几乎一样,修饰符类型少些。
其中地址列表是若干输入项的地址,地址可以是变量地址,数组地址等。
在变量前加取地址运算符&表示变量的地址
输入数据的结束标志:在读入某数据项时,若遇到结束标志,则完成该项数据的读入。结束标志有四类:
1.空白字符:空格键,Tab键,Enter键
2.指定数据宽度
3.指定数据分隔符:可以用普通字符作为数据的分隔符
4.遇到非法字符

注意:%c的格式说明:输入的空白字符也可以作为有效字符读入
*/
int a,b;
scanf("%d%d",&a,&b);

五、数组

一维数组定义的一般形式: 类型说明符 数组名 [整型常量表达式]

//常量表达式不能包含变量和函数调用
int a[6] //合法
int n=6;
int a[n];//不合法

注意:
1.要先赋值后使用
2.字符数组存储字符串的时候要存储一个字符串结束标志符’\0’,字符串的有效长度不包括空字符。
3.字符串一次性输入时,scanf("%s",a);//a为数组名,数组名代表数组首地址注意此时字符串中不能包含空白字符,否则将以空白字符作为串的结束符。处理含有空格的字符串——设多个字符数组,分段存储。

六、函数

区分:函数的原型(声明),函数的定义,函数的调用
1.函数定义
一般形式:

返回值类型 函数名(形参列表){
	声明部分
	执行部分
}

2.函数原型
在主调函数(mian)调用另一个函数之前,应对被调函数进行声明,称为函数的原型,作用是把函数类型,函数名称,形参的类型,数量,顺序告知编译系统,便于编译系统对函数调用形式及返回值类型进行检查处理。

函数原型的一般形式:
被调函数名(参数类型1 [形参1],参数类型2 [形参2],…);

float plus(float a,float b);
float plus(float,float);

函数的原型应该放在主函数的声明部分(此声明非彼声明:区分该函数的声明——函数原型,函数的声明部分——函数体分声明部分与执行部分)。也可以放在所有的函数定义之前,给出各个函数的原型。
一下两种情况可以省略函数原型:
1.被调函数的定义出现在主调函数之前,在主调函数中可以不给函数的原型
2.对库函数的调用不用给函数原型,但必须用include命令,将相应的头文件包含进来。

3.函数调用

参数传递:值传递,地址传递
不管哪种传递方式——都是单向传递,只是将实参的值赋给形参
值传递:用普通变量或数组元素做参数,实参和形参被分配不同的存储空间,互不影响
地址传递:实参传递数组名,或者通过取地址符号传递变量地址,传指针等都是传给形参地址,形参应该是可以存地址的变量(数组,指针),此时形参是实参的引用,可以通过形参改变实参。其实形参为数组时,数组名就是一个指针变量而不是指针常量,编译器会将其按照指针变量处理。

注意: 函数的定义不可以嵌套,函数的调用可以嵌套,特殊的嵌套调用——递归

七、指针

在程序实际运行过程中,对变量值的操作实际上是通过地址进行的。访问方式有两种:1.直接访问:通过引用变量名对其所占的存储单元直接存取数据 2.间接访问:把变量1的地址存放在变量2中,当需要对变量1进行数据存取时,先访问变量2,得到变量2的值即变量1的地址,然后通过地址对变量1的值进行操作。

定义: 专门存放变量地址的数据类型——指针,即指针变量的值为地址。
定义的一般形式:

 数据类型 * 指针变量名;
  //其中数据类型是指指针变量所指向目标变量的类型 ,*是指针变量说明符
 /*由于指针变量存放的是地址,所以不管其指向的是什么类型,
 它的内存大小都是4个字节*/

使用:

/*
取地址运算符:& 作用:获得变量的地址
*/
int a;
int *p=&a; //对a进行取地址运算,并将取得的地址赋给指针变量p
/*
存取运算符: *  
注意区分该符号在定义一个指针变量和使用一个指针变量时的作用
*/
int *p,a;  //此处的*的含义为指向,表示所定义的指针变量可以指向其他变量
p=&a;
*p=20; // 此处的*表示被指向,即代表指针变量所指向的目标变量

指向指针的指针

int a=10;
int *p=&a;  
int **q=&p;
printf("%o\n%o\n%d",q,*q,**q) //输出p的地址,p的值(即a的地址),a的值

指针数组与数组指针

int *p[10] //指针数组,数组的元素都为指向int类型变量的指针
int (*p)[10]  //数组指针 ,指向长度为10的int数组的指针
//其实指向数组的指针也可以直接用普通指针,将数组的首地址即数组名赋值给指针即可
int a[10];
int *p=a;  //p指向数组a

注意:
1.区分指针值的改变p——即指针的指向(变量地址)改变;指针指向的变量值的改变*p
2.数组名其实是一个指针常量
3.指针变量做函数参数为地址传递,起到双向传递的作用,但实质还是单向传递。

八、结构体

结构体类型是一种构造类型,它由若干数据项组成,每一个数据项称为结构体的成员,必须先定义才可以使用。
定义

1.结构体类型的定义

struct[结构体名] //结构体名如果省略了,称为无名结构体
{
	数据类型 成员1;
	数据类型 成员2;
	...
};    //不要漏了分号

2.结构体变量的定义
结构体类型是一种抽象数据类型,它只是表示了由若干不同类型数据项组成的复合类型,定义一个结构体类型只是表示这个类型的结构,不分配内存单元,其中无数据。需要定义结构体类型的变量,可在其中存放数据。定义结构体变量的方式有几种:
1)先定义结构体类型,再定义变量:

struct stu_info
{
	int no;
	char name[20];
	char sex;
	int age;
};
struct stu_info stu1; //定义一个结构体变量stu1

2)在定义结构体类型的同时定义结构体变量

struct stu_info
{
	int no;
	char name[20];
	char sex;
	int age;
}stu1;

注:结构体变量所占的字节数是各成员变量所占字节数之和,sizeof(操作数),sizeof(stu_info)

3.结构体变量的使用
一般对结构体的使用,包括赋值,输入,输出和运算等都是通过结构体变量的成员来实现的。结构体变量成员的引用一般形式:结构体变量名.成员名,结构体成员可以像普通变量一样使用。
注意:
1.如果成员本身又是一个结构体,则必须逐级引用,直到成员级为止。
2.相同结构的结构体变量之间可以相互赋值,不需要逐个成员赋值。

4.结构体数组
定义的一般形式:struct 结构体类型名 数组名[数组长度];
当然也可以在定义结构体类型的时候定义数组。
数组的每个元素为结构体变量。
使用成员形式:结构体数组名[下标].成员名

5.结构体指针变量
当一个指针所指向的变量是结构体变量时,称这个指针变量为结构体指针变量,其值为该所指向的结构体变量的首地址。定义的一般形式:struct 结构体类型 *指针变量名;
注意: 结构体指针变量只是指向对应的结构体变量,不是指向其成员

用结构体指针变量访问成员:
1.(*结构体指针变量).成员名 //括号不能省略,·运算符优先级高于*
2.结构体指针变量->成员名

当结构体指针指向结构体数组时,可以通过自增自减运算改变大小来指向数组的不同元素,进而访问元素的成员。

struc stu_info
{	
	int no;
	char name[20];
	char sex;
	int age;

}stu[10],*p;
p=stu;//p指向结构体数组,stu[0]
p->sex='m';//访问stu[0]的成员
p++//p指向stu[1]
p->sex='f';//访问stu[1]的成员

6.typedef定义类型
用typedef声明新的类型名来代替已有的数据类型名,即别名,然后可以用别名声明变量。
一般形式:typedef 原类型名 新类型名;, 例如:typedef int INTEGER; INTERGER x,y;//等价于int x,y;
特殊的:

//1)为数组类型命名
typedef int INTEGER[10];
INTEGER a;//等价于int a[10];

//2)为指针类型命名
typedef char* STR;
STR P;//等价于char *p;

//3)为结构体类型命名
typedef struct stu_info{
	int no;
	char name[20];
	char sex;
	int age;
} Stu;
Stu stu1,stu[10],*p;//等价于 struct stu_info, stu[10],*p; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yun_gao_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值