一、数组
数组是存放一组相同类型元素的集合。
1、数组的创建
数组类型 数组名[数组长度]; int char double float long
//创建实例
int arr[10];
//实例2
define X 10
int arr1[X];
//定义其他类型数组
char arr2[10];
double arr3[10];
//注:数组进行创建时,[]中必须给一个常量,不能使用变量。可以使用宏定义
//错误示例
int a;
scanf("%d",&a);
int arr4[a]; //数组的长度必须事先定义好,这样写法是不正确的
2、数组的初始化
int arr1[5] = {1,2,3,4,5}; arr1[5] = 5
int arr2[5] = {1,2,3}; //自动补0 arr2 = {1, 2, 3, 0, 0 }
int arr3[] = {1,2,3,4} //长度为4
3、内存中的存储
数组在内存中是连续存储的。可以根据数组首元素获取数组在内存中开始的地址。数组中每一个元素的大小都是固定的,可以根据元素的下标来计算出对应元素的地址。
a[0] 10
例:int a[10],首地址为10,每个元素为int类型占4个字节大小,a[1]的地址为14,a[2]的地址为18,a[9]的地址为4
4、二维数组
创建:
int arr1[3][4];//[行数][列数]
char arr2[][5];
double arr3[2][4];
二维数组创建时,行数可以忽略不写。并且所有维度的数组其第一个方括号的内容可忽略。
初始化:
int arr1[3][4] = {1,2,3,4};
int arr2[3][4] = {{1,2},{4,5}};
int arr3[][4] = {{2,3},{4,5}};
花括号中的一个花括号代表一个一维数组的初始化。当里面无花括号分组时,按照顺序从第一个开始逐个进行初始化。余下的未赋值的元素用0初始化。
#include <stdio.h>
int main()
{
int arr[3][4] = { 0 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
arr[i][j] = i * 4 + j;
}
}
a[0][0] = 0
a[0][1] = 1
a[1][0] = 4
a[1][1] = 5
a[2][1] = 9
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
}
}
return 0;
}
二维数组在内存中也是连续存储的。在形式上是一个二维,实际上是按照一维数组的形式在内存中存储的
真题:设二维数组A[1...100][1...100],按行优先顺序存储在一维数组B[1...10000],每个元素占1个字节,则二维数组A[73][84]在一维数组B中的下标为()。
A、7384 B、7283 C、8372 D、8473 73*100+84 = 7384
真题:数组A[0...7][0...9]的每个元素占8个字节,将其按列优先存储在起始地址为2000的内存单元,则元素A[6][7]的地址是()。
A、2496 B、2336 C、2376 D、2632 (6*10 + 8 - 1)*8 + 2000
#include <stdio.h>
int main()
{
int i, a[10];
for(i=9;i>=0;i--)
a[i]=10-i;
printf(“%d%d%d”,a[2],a[5],a[8]);
return 0
}
852
#include <stdio.h>
int m[3][3]={{1},{2},{3}};
int n[3][3]={1, 2 ,3};
main( )
{
printf(“%d,”, m[1][0]+n[0][0]); 2+1
printf(“%d\n”,m[0][1]+n[1][0]); 0+0
}
#include <stdio.h>
main()
{
int i;
int x[3][3]={1,2,3,4,5,6,7,8,9};
for (i=1; i<3; i++)
printf("%d ",x[i][3-i]); x[1][2] = 6 x[2][1] = 8
}
852 3,0 6 8
二、函数
函数类型 函数名(函数参数)
{
函数体
return
}
//有返回值
int add(int a,int b)
{
return a+b
}
//无返回值
void add1(int a,int b)
{
print("%d",a+b)
}
//无参数
void fun()
{
print("无参数函数")
}
//调用
a = add(1,2) //a为3
add1(2,3) //直接输出5
fun() //输出“无参数函数”
三、指针
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
int p; //这是一个普通的整型变量
int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针
1、指针类型
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
(1)int *ptr; //指针的类型是int*,指针指向的类型是int,占4个字节
(2)char *ptr; //指针的类型是char*,指针指向的类型是char,占1个字节
(3)int **ptr; //指针的类型是int**
2、指针运算
int *p, a = 3;
p = &a;
print("%d",*p) //3
*p = 4
print("%d",a) //输出4
int *q;
q = p;
print("%d",*q) // 输出4
将整型变量a的地址赋给整型指针p,使指针p指向变量a。也就是说,用运算符&取变量a的地址,并将这个地址值作为指针p的值,使指针p指向变量a。
指针的类型和它所指向变量的类型必须相同。
int array[5]={1,2,3,4,5};
int *p=array;
for(i=0; i<5; i++)
{
(*p)++;
p++;
}
//array[5] = {2,3,4,5,6}
四、结构体
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合。
数组是具有相同类型的数据构成的数据集合。
#include <stdio.h>
struct student //结构体类型的说明与定义分开。声明
{
int age; /*年龄*/
float score; /*分数*/
char sex; /*性别*/
};
int main ()
{
struct student a = { 20, 79, 'f'}; //定义
printf("年龄:%d 分数:%.2f 性别:%c\n", a.age, a.score, a.sex );
return 0;
}
//单链表结构体类型 2分
typedef struct LNode{
int data; //结点域
struct LNode *next; //指针域
}LNode, *LinkList;
LNode *p; 定义结点
LinkList L; 定义链表
p->next p->data
L->next L->data
//二叉树结构体类型 2分
typedef struct BiTNode{
int data; //结点域
struct BiTNode *lchild, *rchild; //左右指针
}BiTNode, *BiTree;
五、学习方法
数据结构:三步走。第四章串 不考。
1、第一遍过基础知识点,重点做选择题,大题编程题可不做。算法基础过程,基础实现必须了解。
2、第二遍重点放在编程题上,做第一遍做错的选择题。编程题需要自己手写出来。线性表,队列、栈,二叉树,排序、查找。
3、第三遍过一遍课本,去查缺补漏,以及之前有问题的题在重新做一遍。
操作系统:概念知识点比较多,重点理解,记忆。
1、第一遍看视频,过基础知识点,做课后题。pv操作伪代码可以先剩下。选择全做,大题不用做408真题。
2、第二遍,重点大题 + 选择题
3、第三遍,查缺补漏,过课本。
55过来
i = 0
while(i < n)
{
j = 1
while (j < n)
{
j = j*2
}
}
n次 o(n) o(nlg2n)
for(int i = 0; i<n ;i++)
{
for(int j = 0; j < n ; j++)
{
print("1")
}
} o(n2)
int add()
{
n
} 空间复杂度o(n)
for(int i = 0; i<n ;i++)
{
printf("2")
}
for(int j = 0; j < n ; j++)
{
print("1")
}
0(n) 2n 1/2n
o(n-2) o(n) o(n(1/2))