zoukankan      html  css  js  c++  java
  • 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;//原子变量 别的进程不能访问

  • 相关阅读:
    Git教程
    test
    Android中的权限机制
    Android中<uses-library>的理解
    权限机制
    总是听到有人说AndroidX,到底什么是AndroidX?Android和AndroidX的区别
    VMware Tools按钮变灰色,无法安装的解决方法
    VMware Tools (ubuntu系统)安装详细过程与使用
    Android studio常用快捷键
    CVE漏洞分析
  • 原文地址:https://www.cnblogs.com/polar-lights/p/8456871.html
Copyright © 2011-2022 走看看