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);//#1
 13 	if(n<4)
 14 		up_and_down(n+1);
 15 	printf("LEVEL %d: n location %p
",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;//原子变量 别的进程不能访问

原文地址:https://www.cnblogs.com/polar-lights/p/8456871.html