抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

C语言基础补全

基本数据类型

  1. 使用一个变量时定义int​、char​、float​、double​等类型,开辟不同空间大小的内存
  2. 单片机以stm32​为例子,一般最大使用int​,常见使用unsigned char​或者char​一字节空间作为基本的

数组

  1. 定义20个整型变量、15个字符类型变量、10个浮点变量类型,并赋值。

    • 每组使用数组来定义int a[20];
    • 单片机以stm32​为例,常见的字库使用数组来定义,以ASCII​码顺序编号
  2. 上面的定义了三类数据,每类数据分别需要3个怎么定义和赋值,则可采取数组嵌套即二维数组的方式来定义

    • int a[3][10];​​

指针

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;
//打印均为 3 4 5
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));
//打印为4 5 [一长串数字]
/*
数组a就是地址,是a[0]的首地址,
(a+1)偏移到第二位a[1]的地址,
再取[index]则继续向后偏移index位取其地址位的内容
(a+2)偏移到a[2]的地址,再取index=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;
//打印为2
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];
//打印1
printf("%d",a[0][0]);
printf("%d",p[0][0]);
printf("%d",**p);

地址等效

  1. a[0]​和*p
  2. *p+1​和a[0]+1
  3. *​可以视为降维手段,*p​将12​一组数据降低到a[0]​的一维中,相当于数据做了切分
  4. 类比数据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;
}