C语言基础补全
基本数据类型
- 使用一个变量时定义
int
、char
、float
、double
等类型,开辟不同空间大小的内存
- 单片机以
stm32
为例子,一般最大使用int
,常见使用unsigned char
或者char
一字节空间作为基本的元
数组
定义20个整型变量、15个字符类型变量、10个浮点变量类型,并赋值。
- 每组使用数组来定义
int a[20];
- 单片机以
stm32
为例,常见的字库使用数组来定义,以ASCII
码顺序编号
上面的定义了三类数据,每类数据分别需要3个怎么定义和赋值,则可采取数组嵌套即二维数组的方式来定义
指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| int a[3]={3,4,5}; int b=2; int* p=a;
printf("%d %d %d",a[0],a[1],a[2]); printf("%d %d %d",*a,*(a+1),*(a+2)); printf("%d %d %d",p[0],p[1],p[2]); printf("%d %d %d",*p,*(p+1),*(p+2));
printf("%d %d %d",(a+1)[0],(a+1)[1],(a+2)[2]); printf("%d %d %d",(p+1)[0],(p+1)[1],(p+2)[2]); p=&b;
printf("%d",*p);
|
多维数组
定义一个数组int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
1 2 3 4 5 6 7 8 9 10 11 12 13
| graph TB A[1] B[2] C[3] D[4] E[5] F[6] G[7] H[8] I[9] J[10] K[11] L[12]
|
定义一个int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
的三维数组
1 2 3 4 5 6 7 8 9 10 11 12 13
| graph TB; A[1] B[2] C[3] D[4] E[5] F[6] G[7] H[8] I[9] J[10] H[11] L[12]
|
1 2 3 4 5 6
| int* p; p=a[0];
printf("%d",a[0][0]); printf("%d",p[0][0]); printf("%d",**p);
|
地址等效
a[0]
和*p
*p+1
和a[0]+1
*
可以视为降维手段,*p
将12
一组数据降低到a[0]
的一维中,相当于数据做了切分
- 类比数据
int a[2][5][10];
对其进行取地址*(*(*(p+1)+2)+3)
中间2层*
是降维,先降低到a[1]
这一段,然后偏移2
,数据地址来到a[1][2]
,然后再偏移3
,降维到a[2][5][10]
这一段,最后*
取值得到a[1][2][3]
的值
结构体
两种定义方式
1 2 3 4 5 6 7 8 9 10 11 12
| struct student{ char id[10]; char name[10]; int num[20]; };
typedef struct student{ char id[10]; char name[10]; int num[20]; }stu;
|
结构体链表
1 2 3 4 5 6 7 8 9 10 11 12
| typedef struct Node{ int data; struct LNode* next; }LNode,*Linklist; Lode s; Linklist p =&s;
typedef struct LNode LNode; typedef struct LNode* linklist; linklist=&node;
|
结构体动态申请内存
1 2 3 4 5 6 7
| struct student{ char sno[20]; char name[20]; float score[3]; };
struct student* s=(struct student*)malloc(sizeof(struct student));
|
此处使用(struct student *)
指针类型强制转换,避免结构体在栈上创建,让其在堆上动态创建
tips:
- 局部变量在栈上
- 动态分配在堆上
- 静态全局变量在数据段
结构体赋值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| typedef struct LNode { int data; struct LNode* next; }LNode,*Linklist;
int main() { LNode p1; p1.data=1; p1.next=NULL; LNode p2; Linklist q2; q2=&p2; q2->data=2; q2->next=NULL; Linklist q1=(Linklist)malloc(sizeof(LNode)); q1->data=2; q1->next=NULL; }
|