c语言之要点-泛篇

时间:2023-03-09 21:25:45
c语言之要点-泛篇

1.goto goto由goto和标签名组成,

  1  1 if(....)
2 2 {
3 3 .....
4 4 goto part2;
5 5 }
6 6 part2: printf("......");//可以直接由goto位置跳动到 该位置

2.递归:函数自己调用自己,类似死循环原理,但实际上有条件约束终究会结束的,但是有些函数会建立形参,耗用内存,再递归过程中会不断加大内存耗损,请注意。

  1 #include <stdio.h>
2 void up_and_down(int);
3
4 int main(void)
5 {
6 up_and_down(1);
7 return 0;
8 }
9
10 void up_and_down(int n)
11 {
12 printf("LEVEL %d : n location %p\n",n,&n);//#1
13 if(n<4)
14 up_and_down(n+1);
15 printf("LEVEL %d: n location %p\n",n,&n);//#2
16 }

a:尾递归:

递归完毕,紧接着调用return

3.寄存器变量 register ,这种变量说明函数入口只有一个,也就是只有一个函数在同一时刻访问,期间没有别的函数调用,修改,编译器就可以优化 替代相关的变量,并不会从内存中反复读取。

4.static 修饰的变量在内存中不会被注销,等效于全局变量,但是他的作用于被限定在一个块中,它修饰的函数也只能在本页代码中调用。

5.变量的位置  全局变量和静态变量在内存的一个位置,初始化的全局变量和初始化的静态在一个位置,未初始化的全局和未初始化的静态在相邻位置

6.分配内存  malloc 和 free,由于c语言想要实现动态特性来解决资源浪费的某些情况。

  1 double * ptd;
2 ptd = (double * )malloc(30*sizeof(double));
3 //malloc返回一个指向数据类型的指针,一般要使用强制数据转化,malloc 参数一般是你需要开辟空间的大小,比如你要开辟多少个元素。返回的指针可以是各种类型,常用于结构体,链表,队列,数组等等

free来响应的释放内存,这个很重要,不然内存会泄露

calloc也可以用来分配内存

  1 long * newmem;
2 newmem = (long *) calloc(100,sizeof(long));

使用两个参数 第一个参数表示数量 ,第二个表示单个占用空间的大小

处理变长数组

  1 int n=5;
2 int m=6;
3 int ar2[n][m];//nxmµÄ±ä³¤Êý×é
4 int (* p2)[6];//c99֮ǰµÄÊý×é
5 int (* p3)[m];//ÒªÇóÖ§³Ö±ä³¤Êý×é¡
6 p2 = (int (*) [6])malloc(n*6*sizeof(int));//nx6 Êý×é
7 p3 = (int (*) [m])malloc(n*6*sizeof(int));//nxm Êý×é(ÒªÇóÖ§³Ö±ä³¤Êý×é)
8 ar1[1][2]=p2[1][2]=12;

但是malloc的操作会造成大量的内存碎片

7.ANSI C类型限定符

const volatile restrict  三种类型限定符

const修订的变量不会被改变,编译器会抓到你要修改,并报错,const修订指针,有的指针不能改变,有的指针指向的数据不能改变。

const float * pf;//pf指向一个float类型的const值  指向的值不能改变(在嵌入式中,该部分数值存放在flash中),但是pf可以指向其他地方

float * const pt;// pt是一个const指针 该指针只能指向一个位置,但是指向的值可以改变

const float * const ptr;//完全被固定,该指针不能改变,指向的数据也不能改变。

volatile 就是防止编译器优化,一般一个变量在程序中多次出现,编译器很容易将他放置到寄存器中进行优化,提升运算速度。 告诉编译器这个变量是经常改变的(dma数组 有多个线程改变数据),请一直从内存中读取。

restrict

  1 int ar[10];
2 int * restrict restar = (int * )malloc(10*sizeof(int));
3 int * par = ar;
4 for(n=0;n<10;n++)
5 {
6 par[n]+=5;
7 restar[n]+=5;
8 ar[n]*=2;
9 par[n]+=3;
10 restar[n]+=3;
11 }
12 //restar[n]+=8 //可以替换 par[n]+=8;//进行数据替换 将会出错 中间改变了
13

_Atomic (c11) 适用于多线程的原子变量

_Atomic int hogs;//原子变量 别的进程不能访问