目录
【数据结构与算法第一章】编程基础
1.1 变量与数据类型
- 变量:
① 在C语言中,所有变量必须先声明后使用;
② C语言变量名智能由数字、字母和下划线组成,且变量名不能以数字开头,不能是C语言的关键字。
- 数据类型:
① int型(整数类型),float型(浮点数类型),char型(字符串类型);
② 在C语言中,可以使用sizeof操作符获取变量所占空间大小,并返回变量所占的字节数。
1.2 指针
- 指针变量简称指针。指针变量与int,float等变量不同,它存放的是变量对应的地址。
- 在声明指针时,*充当标识符,标识声明的变量是一个指针变量。
- 在用指针访问变量时,*表示获取指针指向地址的值。
- &是取址符,&y表示取得变量y的地址。
1.3 结构体
结构体通常用来表示类型不同但是又相关的若干数据。
- 结构体的定义和创建:
Notice:结构体定义必须以分号结尾,否则编译无法通过
// struct 结构体名{成员列表};
// 示例如下:
struct stuInfo
{
int stuId,rank;
float score;
}zhangsan;
在考试中,typedef常用于给结构体类型取别名。这种方式在定义新的结构体变量时,可以省略struct关键字;
Notice:在定义结构体类型时,当结构体成员有指向该结构体本身的指针时,typedef struct后面的结构体名称不可省略
// 给结构体命名
typedef struct stuInfo //此处的stuInfo可以省略
{
int stuId,rank;
float score;
}stuInfo;
// 创建一个stuInfo类型变量,变量名为zhangsan
stuInfo zhangsan;
- 结构体内部变量的访问:
① 结构体变量访问其成员变量时,使用.运算符;
② 结构体指针访问其成员变量时,使用->运算符。
// 结构体变量
zhangsan.score
// 结构体指针
zhangsan->score
1.4 数组和链表
数组和链表都是有序排列的同类数据元素的集合。
- 数组的创建:
① 基本数据类型:int arr[10];
② 用结构体类型创建:stuInfo students[50];
③ 用malloc函数或者new关键字向内存的动态存储区中申请一块连续的地址空间来创建数组。
创建一个能存放100个int型数据的数组arr的代码如下:
// 定义一个int型指针arr
int *arr;
// 用malloc函数申请大小为100个int数据的连续空间,并把首地址赋给arr
arr = (int *)malloc(sizeof(int)*100);
// C++中可以直接用new来申请
int *arr = new int[100];
- 链表是一种数据元素逻辑地址相邻但物理位置不一定相邻的存储结构。
typedef struct LinkNode
{
int data;
struct LinkNode *next;
}LinkNode;
LinkNode A,B,C;
A.next = &B; // 将A的下一个元素设为B
B.next = &C; // 将B的下一个元素设为C
1.5 程序结构
- 分支结构(if语句,switch语句):
① if语句后面接着判断条件,用小括号包裹。如果条件为真,则执行大括号中的语句,否则跳到else部分;
② 如果有多行代码,则必须用大括号将分支对应的代码块括起来。
- 循环结构(while,do...while和for语句)
1.6 函数中参数的传递
- 函数定义:
C语言程序的执行总是从main函数开始,最后也是由main函数来结束整个程序。
函数语法格式的要点如下:
① 返回值类型:函数执行结束之后的返回值类型可以是void(返回值为空)、int、float等一些基本数据类型,也可以是指针或自定义的结构体;
② 函数名:由用户确定;
③ 参数列表:形式为“参数类型 参数名”,传入的每一个参数都要声明参数类型,需要与变量的定义相区别,即若要传入两个int型变量,括号内写法应该为int a, int b而非int a,b ;
④ 函数主体:函数主体包含一组定义函数执行任务的语句;
⑤ 返回值:C语言中使用return来返回函数需要传回的数据,且return后面的数据类型要与函数定义的返回值类型一致。若函数的返回值类型为void,则无需返回具体值,但可以通过return语句来提前结束函数的执行。
- 函数调用:
① 直接调用;
② 嵌套调用:在一个函数中调用另一个函数;
Notice:不能在函数中定义函数,即不能“嵌套定义函数”
③ 递归调用:一个函数调用自身函数的行为(递归一般会有边界条件,即递归结束的条件,也叫递归基)
Notice:递归问题一般分为三要素:明确递归函数,寻找递归公式,确定递归边界。
- C语言中函数的形参与实参:
C语言中函数的参数出现的位置有两个,在函数定义处的参数叫形参,在函数调用处的参数叫实参。
① 形式参数(形参):在函数定义中出现,只有在该函数被调用时,才会为形参分配存储空间,接收传入函数的数据,形参才会得到具体的值;
② 实际参数(实参):在函数调用中出现,包含具体的数据,在发生函数调用时,实参内的值会传递给形参,从而被函数内部的代码使用。
Notice:数据从实参向形参传递的过程叫做单向值传递。在函数内部对于形参的操作并不会影响实参的值;当数组名作为参数传入时,函数可以直接对该原数组中的元素进行操作,因为数组名对应的是数组的首地址,故参数传递中传递的是地址。形参数组取得该首地址后,形参数组和实参数组便为同一个数组,共享一段内存空间。
- 参数传递:
① 传值,错误例子如下:
// 交换参数数值的错误示例
void swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
这个函数并不能交换a,b的值,因为数据从实参到形参的传递为单向值传递。
② 传指针(传地址):在参数的传递过程中传递的不是欲交换的数值而是参数地址;
// 交换参数数值的正确示例
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main(){
int c = 1, d = 2;
swap(&c, &d);
return 0;
}
③ 传引用:C++还提供了传引用的参数传递方式,传引用能够达到和传指针同样的效果。所谓引用,就是给已存在变量取一个别名,通过这个别名和原来的名称都能够找到这份数据。定义引用类型的格式类似于指针格式,只是用&取代了*,例如:数据类型 &引用变量名 = 引用实体。
Notice:传引用在形参定义时需要添加&,但在函数内使用形参时,直接将其作为一个普通数据类型的变量进行相关操作即可。
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main(){
int c = 1, d = 2;
swap(c, d);
return 0;
}
1.7 C语言中运算符的含义
假设A=10,B=3,相关运算如下表所示:
标签:链表,函数,int,程序结构,C语言,运算符,参数,指针,变量 From: https://blog.csdn.net/henry_fine/article/details/141335861