欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c 学习

程序员文章站 2022-03-05 12:56:24
...

一、环境

  1. 环境

     linux yum install gcc-c++
     mac 改为 brew install gcc 如果mac么有安装brew需要用ruby安装
    
     $ gcc hello.c
     $ ./a.out
     Hello, World!
    
  2. 请确保您的路径中已包含 gcc 编译器,并确保在包含源文件 hello.c 的目录中运行它。

  3. 如果是多个 c 代码的源码文件,编译方法如下:

    $ gcc test1.c test2.c -o main.out $ ./main.out test1.c 与 test2.c 是两个源代码文件。

  4. 回调函数

    函数指针作为某个函数的参数

    函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。

    简单讲:回调函数是由别人的函数执行时调用你实现的函数。

    以下是来自知乎作者常溪玲的解说:

    你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。

    1. 实例

      实例中 populate_array 函数定义了三个参数,其中第三个参数是函数的指针,通过该函数来设置数组的值。

      实例中我们定义了回调函数 getNextRandomValue,它返回一个随机值,它作为一个函数指针传递给 populate_array 函数。

      populate_array 将调用 10 次回调函数,并将回调函数的返回值赋值给数组。

    2. 实例

       #include <stdlib.h>  
       #include <stdio.h>
      
       // 回调函数
       void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
       {
       	for (size_t i=0; i<arraySize; i++)
       		array[i] = getNextValue();
       }
      
       // 获取随机值
       int getNextRandomValue(void)
       {
       	return rand();
       }
      
       int main(void)
       {
       	int myarray[10];
       	populate_array(myarray, 10, getNextRandomValue);
       	for(int i = 0; i < 10; i++) {
       		printf("%d ", myarray[i]);
       	}
       	printf("\n");
       	return 0;
       }
      

      编译执行,输出结果如下:

      16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709

  5. 结构体

     struct 标识
    
  6. 按位运算 101010 101010 101010 & 011100 | 011100 ^ 011100 --------- ---------- ---------- 001000 111110 110110

  7. 位域

    位域声明 在结构内声明位域的形式如下:

     struct
     {
       type [member_name] : width ;
     };
    

    下面是有关位域中变量元素的描述:

    元素 描述
    type 整数类型,决定了如何解释位域的值。类型可以是整型、有符号整 型、无符号整型。
    member_name 位域的名称。
    width 位域中位的数量。宽度必须小于或等于指定类型的位宽度

    下面的结构定义指示 C 编译器,age 变量将只使用 3 位来存储这个值,如果您试图使用超过 3 位,则无法完成。让我们来看下面的实例:

     #include <stdio.h>
     #include <string.h>
    
     struct
     {
       unsigned int age : 3;
     } Age;
    
     int main( )
     {
        Age.age = 4;
        printf( "Sizeof( Age ) : %d\n", sizeof(Age) );
        printf( "Age.age : %d\n", Age.age );
    
        Age.age = 7;
        printf( "Age.age : %d\n", Age.age );
    
        Age.age = 8; // 二进制表示为 1000 有四位,超出
        printf( "Age.age : %d\n", Age.age );
    
        return 0;
     }
    
     当上面的代码被编译时,它会带有警告,当上面的代码被执行时,它会产生下列结果:
    
     Sizeof( Age ) : 4
     Age.age : 4
     Age.age : 7
     Age.age : 0
    
  8. typedef vs #define

     #define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:
    
     typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
     typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。
    

转载于:https://my.oschina.net/u/3730149/blog/3081305