C语言-3

c语言中sqlite3的使用方法 c语言中sqlite3的使用方法,用sqlite3写一个简单的学生库,存有学生的id、姓名、成绩,以及对这些数据的增删改查 阅读详情

定义指针

/*
    指针的概念:
        1.为了方便访问内存中的内容,给每一个内存单元,进行编号,
        那么我们称这个编号为地址,也就是指针。

        2.指针也是一种数据类型,指针变量有自己的内存,
        里面存储的是地址,也就是那些编号。

    四要素
        1.指针本身的类型    例如:float*    int*    ...
        2.指针指向的类型    例如:float        int        ...
        3.指针本身的内存
        4.指针指向的内存

    运算符
        *:
        1.定义指针时,通过 * 符号,来表示定义的是一个指针,并且是指针自身的类型的组成部分
        2.其他时候,表示解析引用(取内容:通过内存编号,读取内存中的内容)

        &:取(首)地址符,作用:取出(内存的)首地址
*/

# include <stdio.h>

int main()
{
    // 定义指针(指针:pointer)
    float* p_name;    // 指针本身的类型:float*    指针指向的类型:float
    int * p1;
    int *p2;        // * 符号偏不偏移不影响其功能

    return 0;
}

指针初始化与赋值

/*
    知识储备:
        // 初识化:定义的同时,给值
        int a = 0;

        // 赋值:先定义,再给值
        int b;
        b = 0;
*/

# include <stdio.h>

int main()
{    
    // 初始化
    int num = 6;
    int val = 8;
    
    // 初始化
    int* p1 = &num;    // 对于指针变量p1,如果进行给值,必须给地址(内存编号)

    // 赋值
    int* p2;
    p2 = &val;


    // 自行体会
    int* p3 = p1;
    

    // 直接存入地址(不推荐使用,因为你不知道自己随便写的地址里面是什么!!)
    int* p4 = (int*)123456;    // 将 整型123456 强转为 int*类型 的“地址”
    int* p5 = (int*)0XAB25;    // 计算机中的内存地址通常用16进制数表示


    // 直接使用地址:置空(即:"使用0地址,NULL:0X0")
    int* p6 = NULL;    // 等价于 int* p6 = (int*)0X0;
    // 目的:为了给暂无指向的指针,提供指向,保证安全,将内存中的0地址特殊化


    // 数组名就是数组的首地址
    int arr[3] = { 1, 2, 3 };
    // 数组类型:int [3]
    // 元素类型:int
    // arr 类型:int*
    int* p7 = arr;


    return 0;
}

探究内存

/*
    1.变量在内存中所占的字节数
    所有的指针变量,不论类型,在内存中所占的字节数都是一样的,都是4个字节(或者8个字节)
    (8个字节是因为时代的发展,部分好的计算机性能得到提升,一般都是4个字节)

    2.指针本身的内存,以及指针指向的内存
    指针本身的内存:4个字节(指针变量只需要存储,所指向的变量的首地址)
    指针指向的内存:看你所指向的类型,视情况而定
*/

# include <stdio.h>

int main()
{    
    double num = 12.0;
    double* p1 = &num;
    printf("%f \n", num);
    printf("%f \n", *p1);    // 利用指针,取得 num 的值

    return 0;
}

在这里插入图片描述

指针的偏移

在这里插入图片描述

内存区域划分-基础

/*
内存区域的划分
四个:常量区,栈区,堆区,静态全局区
五个:常量区,栈区,堆区,静态全局区,代码区

1.代码区:存代码
2.常量区:存常量
3.静态全局区:静态(static)变量,全局变量
4.栈区:普通局部变量
5.堆区:由程序员手动申请,手动释放
*/

# include <stdio.h>

int a;                // 普通“全局”变量(初识值默认为零)
// 作用域:当前项目
// 生命周期:程序开始到结束

static int b;        // 静态“全局”变量(初识值默认为零)
// 作用域:当前文件
// 生命周期:程序开始到结束

int main()
{    
    int c;            // 普通局部变量(无初始值)
    // 作用域:当前语块
    // 生命周期:当前语块

    static int d;    // “静态”局部变量(初识值默认为零)
    // 作用域:当前语块
    // 生命周期:程序开始到结束

    return 0;
}
# include <stdio.h>

void func()
{
    static int num;        // 只会定义一次

    printf("%d \n", num);
    num++;
    printf("%d \n", num);

}

int main()
{    
    func();
    func();
    func();

    return 0;
} 

/*
    运行结果:
        0
        1
        1
        2
        2
        3
        请按任意键继续. . .
*/

空类型指针

/*
    void* 指针
    1.不能自增自减
    2.不能偏移
    3.不能读取内容
    但是!可以接收任何类型的指针而不需要强转类型
    可以利用这个特点,将 void* 指针当作通用的存放地址的“容器”
    e.g.
        int a = 6,b = 8.8;

        int* p1 = &a;
        double* p2 = &b;

        void* p0 = NULL;    // 当作存放“内存地址”的容器使用
        p0 = p1;
        p0 = p2;
        ...

*/

# include <stdio.h>

int main()
{    
    void* p0 = NULL;

    return 0;
}

简单开辟内存

/*
    简单开辟内存
        1.申请
        ---有两个函数能够实现申请内存的功能:
            A. malloc(参数:需要字节的总数);
            B. calloc(参数:每个需要的字节数,个数);
            返回值都是 void* 类型的指针
        2.使用
        3.释放
            free(参数:首地址)
            如果不释放的话,会导致“内存泄露”
        4.置空
            如果不置空的话,会出现“野指针”
*/

# include <stdio.h>

int main()
{    
    /* malloc */
    double* p = (double*)malloc(sizeof(double));    // 申请一个double类型大小的内存(8字节)
    *p = 3.14;    // 使用
    printf("%lf \n", *p);
    free(p);    // 通过 p 里面存储的首地址,找到相对应的内存,从这里开始释放,一直释放到,申请内存的时候,做了标记的地方
    p = NULL;    // 通过置空,让指针不再指向已经被释放掉的内存


    /* calloc */
    float* p1 = (float*)calloc(sizeof(float),1);
    *p1 = 3.14f;
    printf("%f \n", *p1);
    free(p1);
    p1 = NULL;


    printf("进阶运用 \n");


    // 进阶运用
    p = (double*)malloc(sizeof(double)*10);    // 申请10个 double 类型大小的连续的内存(补充:因为上面将p定为 double* 而且置空过了,所以可再度利用)
    for (int i = 0; i < 10; i++ )
    {    
        *(p + i) = 10 + i;    // 给值
        printf("%lf \n", *(p + i));    // 展示值
    }
    free(p);
    p = NULL;
    /*
        对于上面 for 循环部分的补充:
        p:里面存的是:申请的内存的首地址
        在一次申请中,申请的内存是连续的
        *(p + i) <===> p[i]        // 注意!它不是数组!
    */
    
    return 0;
}
# include <stdio.h>

int main()
{    
    // 指针布局
    int row = 3;
    int** pp = (int**)calloc(sizeof(int*), row);

    int len = 4;
    for (size_t i = 0; i < row; i++)    // size_t是什么?点我跳转学习
    {
        pp[i] = (int*)calloc(sizeof(int), len);
    }

    // 内容展示
    for (size_t i = 0; i < row; i++)
    {
        for (size_t j = 0; j < len; j++)
        {    
            pp[i][j] = i * 10 + j;    // 给值
            printf("%-5d", pp[i][j]);    // 展示值,注意!这里不是二维数组!(看不懂请回顾上页内容)
        }
        printf("\n");
    }

    // 释放内存
    for (size_t i = 0; i < row; i++)
    {
        free(pp[i]);
        pp[i] = NULL;
    }
    free(pp);
    pp = NULL;
    
    
    return 0;
}

自动扩容

# include <stdio.h>

int main()
{    
    int len = 5;    // 默认长度
    int* p = (int*)calloc(sizeof(int), len);
    
    int num = 1;
    for (size_t i = 0; num != 0; i++)    // 用户不输入0结束,就一直获取数据并复制到开辟的内存中
    {
        scanf("%d", &num);
        p[i] = num;        // 数据复制到开辟的内存中
    }
    for (size_t i = 0; p[i] != 0; i++)
    {
        printf("%-5d", p[i]);    // 展示数据
    }
    free(p);
    p = NULL;
    
    return 0;
}
/*
    扩容的本质是:
        将小内存中的所有内容拷贝到大内存中,然后,再继续对大内存进行别的操作
*/

# include <stdio.h>

int main()
{    
    // 长度
    int len = 5;
    // 首次申请内存
    int* p = (int*)calloc(sizeof(int), len);
    int* temp = p;    // 成为p的分身,以防万一

    // 重复输入数据(并复制到内存中)
    int num = 1;
    int i = 0;
    while (scanf("%d", &num), num != 0)
    {
        if (i < len)    // 没满的情况下
        {
            temp[i++] = num;    // 存完一次,记录一下
        }
        else   // 满了的情况下
        {
            len += 5;
            p = (int*)calloc(sizeof(int), len);        // 重新申请更大的内存
            for (int j = 0; j < i; j++)
            {
                p[j] = temp[j];
            }
            free(temp);
            temp = NULL;
            temp = p;    // 继续成为当前p的分身
            temp[i++] = num;
        }
        
    }
    // 输出数据
    printf("--------------------\n");
    for (int j = 0; j != i; j++)
    {
        printf("%d \n", temp[j]);
    }

    free(p);
    p = NULL;
    temp = NULL;
    
    return 0;
}

内存区域划分-进阶

/*
    内存区域的划分

    1.代码区
        存储代码


    2.常量区
        存储常量


    3.全局区(静态全局区)
        存储: 1.静态变量    2.全局变量

        # include <stdio.h>

        int c;            // 普通全局变量
        static int d;    // 静态全局变量

        int main()
        {
        int a;            // 普通局部变量
        static int b;    // 静态局部变量

        int c;    // 注意这个c不是上面的c,它们只是名字看起来一样而已

        a = 10;        // 普通局部变量没有默认初始值,所以需要自己赋值
        printf("a = %d \n", a);
        printf("b = %d \n", b);
        printf("c = %d \n", c);
        printf("d = %d \n", d);
        // 通过以上 printf,可以总结规律:静态全局区,默认的初始值为0


        // 作用域和生命周期

        作用域            生命周期
        普通全局变量        当前项目        程序开始到程序结束
        静态全局变量        当前文件        程序开始到程序结束
        普通局部变量        当前语块        当前语块
        静态局部变量        当前语块        程序开始到程序结束

        return 0;
        }

        
    4.栈区
        存储:普通局部变量
        从定义时系统自动分配内存,离开当前语块系统就会自动回收内存 


    5.堆区
        由程序员手动申请和释放
*/

指针与函数

/*
    1.指针函数
        返回值类型是指针的函数
    2.函数指针
        指向函数的指针
*/
// 1.指针函数


// 下面的代码是一个错误的例子,你能发现它的错误吗?
# include <stdio.h>

int* test();    // 声明

int main()
{    
    int* temp = test();
    printf("%d \n", *temp);
    return 0;
} 

int* test()
{
    int num = 10;
    int* p = &num;
    return p;    // 返回了栈区变量的首地址(非常严重的问题!详情见下)
}

/*
    下面的内容是在栈区,当运行完毕,系统会回收其内存资源:
        int* test()
        {
            int num = 10;
            int* p = &num;
            return p;
        }
    当函数返回栈区变量 num 的内存地址之后,
    函数运行完毕,系统回收 num 内存,供以后"某某东西"使用
    所以,返回的地址不但没有作用,还会导致以后非法访问内存的问题出现

*/
// 2.函数指针

/*
    函数指针的定义
    返回类型说明符 (*函数指针变量名)(参数列表);
*/

# include <stdio.h>

int func();    // 声明

int main()
{    
    // 定义函数指针,并进行初始化
    int(*p)() = func;    // 即:定义了指针p,而且 p 等于 func(func里面存的是函数的首地址)
    func();
    p();
    return 0;
}

int func()
{
    printf("成功执行了 func 函数!\n");
    return 6;
}
// 函数指针,知识扩展1

# include <stdio.h>

int func();    // 声明

typedef int funcType();    // 将 int...() 取别名为 funcType

int main()
{    
    funcType* p = func;
    p();
    return 0;
}

int func()
{
    printf("成功执行了 func 函数!\n");
    return 6;
}
// 函数指针,知识扩展2

# include <stdio.h>

int func(int a, int b);    // 声明

typedef int(*pfunc)(int a, int b);

int main()
{    
    pfunc p = func;        // 这样也能定义函数指针
    int res = p(1,2);
    printf("%d \n", res);

    return 0;
}

int func(int a, int b)
{
    printf("成功执行了 func 函数!\n");
    return a + b;
}

指针与数组

/*
    1.指针数组
        ......

    2.数组指针
        ......
*/
// 1.指针数组


/*

# include <stdio.h>

int main()
{    
    // 定义并初始化"数组"
    int arr1[3] = { 1, 2, 3 };    // 数组 arr1[3] -> 里面存的都是 int 类型


    // 定义并初始化"指针数组"
    int* arr2[3] = { 地址1,地址2,地址三 };    // 数组 arr2[3] -> 里面存的都是 int* 类型
    arr2[2] = 新地址;

    return 0;
} 

*/
// 2.数组指针

/*
    定义"数组"指针:
        所指向的数组里面存的数据类型 (*数组指针名称)[所指向的数组的长度];
*/

# include <stdio.h>

int main()
{    
    int arr[3] = { 1, 2, 3 };    // 建立一个数组。
//    arr 里面存的是数组内存的首地址,而 [] 表示内存里面存的那一堆东西是数组,3 表示数组长度,int 表示数组里面存的数据是 int 类型

    int(*p)[3];    // 长度为 3 的数组指针
    p = arr;
    printf("%d \n", p[1]);

    return 0;
}
// 数组指针,知识扩展

# include <stdio.h>

typedef int(*pType)[3];    // 定义类型:int(*pType)[3],取别名为:pType

int main()
{    
    int arr[3] = { 1, 2, 3 };
    pType p;    // 变量 p 的类型为 pType,而属于这种类型的变量 p 必然满足 int(*pType)[3] 模板格式
    p = arr;    // arr里面储存的“数组的内存首地址”复制给变量 p
    printf("%d \n", (*p)[0]);    // 注意!不要写成 p[0],虽然 p 获得了 arr 里面存的首地址,但是 *p 才是代表数组整体

    return 0;
} 

/*
    同理:
    # include <stdio.h>

    typeof int pArr[3];

    int main()
    {
        int arr[3] = { 1, 2, 3 };
        pArr p;
        p = arr;
    }
*/

使用const修饰指针

/*
    const:常量,被它修饰的变量会具有常量的属性,使用 const 修饰指针包含三种情况
        1.常量指针(指向常量的指针)
            指向常量的指针 type const *p; 或者 const type *p;
            可以改变指向,但是不能用 *p 修改指向变量的值


        2.指针常量
            它是常量,本身不能改变,也就是不能改变指向
            因为指向不能改,所以必须初始化
            但是可以通过取内容修改指向的内存中的内容


        3.常量指针常量("常量指针"常量即:指针常量)
            指针本身是一个常量,指向的也是常量
            const int * const p = &a;
            不能改变指向,也不能改变指向的内存的内容
*/

# include <stdio.h>

int main()
{
    const int num = 0;    // 变量 num 使用 const 修饰了就不能被修改了
    
    // 1.常量指针
    int a = 0, b = 9;
    const int * p = &a;        // const -> int
    p = &b;    // 可以改变指向


    // 2.指针常量
    int c = 6;
    int* const p1 = &c;        // const -> p1
    *p1 = 10;    // 可以修改内容


    // 3.常量指针常量
    int d = 8;
    const int* const p = &d;    // const -> int 和 p


    return 0;

}

指针和结构体

/*
            指针与结构体:
    指针与结构体结合起来使用包含两种情况:
    一.指针成员
        结构体变量的成员中存在指针

    二.结构体指针
        指向结构体变量的指针
*/
// 指针成员

# include <stdio.h>

typedef struct
{
    int n;
    int m;
    int* p;    // 定义指针

}MyStruct;

int main()
{
    MyStruct mystr;
    mystr.n = 0;
    mystr.m = 0;
    mystr.p = NULL;    // 地址置空
    return 0;

}
// 结构体指针

# include <stdio.h>

typedef struct
{
    int n;
    int m;

}MyStruct;

int main()
{
    MyStruct mystr;
    mystr.n = 0;
    mystr.m = 0;
    
    MyStruct* p = NULL;    // 定义一个指针 p ,它的类型是 MyStruct*,即该指针指向的是有 MyStruct 类型的变量(首地址)
    p = &mystr;    // mystr 便符合条件,可以将首地址 &mystr 赋值给 p

    // 注意!通过指针访问“结构体中的元素”的时候,用 -> 符号,而不是用 . 符号
    p->n = 9;
    p->m = 8;
    return 0;

}

使用指针的注意事项

/*
    注意事项
        1.避免野指针
            推荐:每次定义指针都进行初始化(有指向就给指向,没指向就置空 )
        2.注意类型匹配
        3.防止内存泄漏
            只有堆区是自己申请,自己释放,其他地方都是系统分配,系统回收

        总结:指针能够直接操作内存,必须在自己明确用途的情况下使用,否则很可能会造成严重后果!
*/
如何使用Sublime Text3搭建C语言开发环境 文章目录前言一、Sublime Text3的优点二、下载安装Sublime Text31.下载2.创建快捷方式三、设置中文界面1.步骤一2.步骤二3.步骤三四、搭建c语言开发环境1.步骤一2.步骤二3.步骤三4.步骤四五、参考资料 前言 笔者前几日在听某一网课时,听到该老师说到,目前很多互联网公司很多都在使用Sublime Text作为自己的开发工具,所以笔者立马下载了该软件,准备日常写一写C语言代码。于是笔者就在网上搜索如何构建C语言的开发环境,但是找的很多资料都很片面,零碎,以至于试了很多方法,浪费了大 阅读详情

相关推荐

C语言 2-3树

2-3树简介 实现过程 代码实现 2-3树简介 2-3树是最简单的B-树(或-树)结构,其每个非叶节点都有两个或三个子女,而且所有叶都在统一层上。 2-3树的模拟过程可以看链接:InsertSortion 实现过程 在2-3树中,一个结点只有一个值的我们称为2-结点,有两个值的称为3-结点,在2-3树中,一个结点最多只有两个值,即3-结点。 ...

fpk2014的博客 3084

【亲测免费】 C3语言编译器——c3c项目推荐

C3语言编译器——c3c项目推荐 【免费下载链接】c3c Compiler for the C3 language 项目地址: https://gitcode.com/GitHub_Trending/c3/c3c ...

gitblog_01114的博客 871

linux下sqlite3在c语言中应用实例

/* ************************************************************************** * File Name: 1.sqlite3.c * Description : 1)数据插入,删除,清空 * 2) * Author : Xubing * Created Time: 2016年10月3

学习ing......... 5143

C语言操作SQLite3简明教程

C语言去操作SQLite3

爱就是是恒久忍耐的专栏 1万+

无向图的3着色问题(C语言)

无向图的3-着色(C语言)代码 #include<stdio.h> #define INITIAL -1 int graph[100][100]; //图的邻接矩阵 int N,M; //顶点数&边数 int colour[100]; int sum=0; int initial(){ //对整个图形初始化 for(int i=0;i<100;i++){ colour[i]=0; //0代表每个顶点没涂颜色 for(int j=0;j<100;

csdn2019429的博客 3706

Isaac Sim 6 利用Replicator实现高效语义分割与实例分割(实践指南5.10)

本文详细介绍了如何利用Isaac Sim 6的Replicator工具高效生成语义分割和实例分割数据集。通过虚拟环境自动标注,效率提升20倍以上,特别适用于农业机器人等计算机视觉项目。文章包含环境配置、场景构建、批量标注技巧及实例分割处理等实战指南,帮助开发者快速掌握合成数据生成技术。

weixin_42526415的博客 266

深入理解C3编程语言与C3线性化模型

C3 是一种编程语言的概念,可以指代不同的事物,但常见的是指 C3 编程语言或 C3 模型。C3 编程语言:设计目标: C3 编程语言设计的目的是为了简化编程,同时保留强大的功能。它通常关注于提高编程效率和代码的可读性。特点: 这类语言可能具有简化的语法和更高级的抽象,旨在解决传统编程语言中的某些局限性。应用领域: 这种语...

weixin_31755877的博客 777

用Java实现森林冰火人游戏

g.drawString("游戏结束", CELL_SIZE * COLS / 2 - 100, CELL_SIZE * ROWS / 2);g.drawString("难度级别: " + difficultyLevel, 10, CELL_SIZE * ROWS + 60);g.drawString("生命值: " + playerHealth, 10, CELL_SIZE * ROWS + 20);setTitle("森林冰火人");

2401_82778412的博客 1734

c3-lsp:C3语言的强大语言服务器

c3-lsp:C3语言的强大语言服务器 项目介绍 c3-lsp 是一款针对 C3 语言的开源语言服务器(Language Server Protocol,LSP)。LSP 是一种通用的协议,用于在不同的编辑器和 IDE 中提供智能编程功能。c3-lsp 支持代码补全、跳转到定义、跳转到声明、悬停提示以及签名帮助等特性,极大地提升了使用 C3 语言进行开发的效率和体验。 项目技术分析 c3-lsp ...

gitblog_00861的博客 1028

TTL电路搭建半加器实验:操作指南完整版

通过TTL电路搭建半加器,详解逻辑设计与实验步骤,帮助掌握数字电路中的半加器工作原理与实际应用,适合电子技术初学者动手实践。

weixin_42524864的博客 355

Android开发工程师面试问题与参考答案

这是一份Android开发工程师职位面试指南,主要针对自研OS开发岗位。岗位要求3年以上独立开发经验,熟悉Android平台UI设计、四大组件和Java基础。面试问题覆盖五大核心领域:基础知识、开发经验、技术深度、问题解决和性能优化。文章提供了典型面试问题及专业参考答案,帮助应聘者准备关键技术点,如多线程处理、HashMap与ConcurrentHashMap区别、Handler机制等。同时建议应聘者结合项目经验展示优化能力,并注意公司提供完善的薪酬福利和团队文化。

郑伟强dev的专栏 892

【C语言】用C语言求3-100之间的素数

问题:求3-100之间素数之和 本题主要是了解素数的概念和括号的位置,当自己代码写完的时候自己试着在自己的大脑中走一遍流程看是否自己能走通,一定了解自己所写的代码。 #include <stdio.h>//计算3-100之间的素数之和 void main() { int i,j,sum=0; for(i=3;i<=100;i++)//i控制要检测的数是否为素数 { fo...

Zarek_IT的博客 1万+

GitHub霸榜神器!NextChat领衔DeepSeek全栈开发范式

NextChat(原ChatGPT-Next-Web)是GitHub上斩获81.2K星标的现象级开源项目,定位为"轻量级AI助手终端",支持DeepSeek、Claude、GPT-4、Gemini等20+主流大模型。• 原生集成DeepSeek、GPT-4、Gemini Pro等模型API,同时兼容RWKV-Runner、LocalAI等自建模型框架,通过环境变量。• 客户端体积仅5MB(Windows安装包约6MB),采用PWA渐进式Web应用技术,首屏加载速度优化至100KB级,老旧设备亦可流畅运行。

实战AI智能体 893

c语言3×3行列互换_C语言 | 找出3对赛手的名单

“要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人…万中无一”——包租婆这道理放在C语言学习上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语言小白进阶到高手,需要经历的是日积月累的学习。那么如何学习呢?当然是每天都练习一道C语言题目!!作者闫小林白天搬砖,晚上做梦。我有故事,你有酒么?例59:两个乒乓球队进行比赛,各出3个人。甲队为A,B,C,3人,...

weixin_39801202的博客 416

当C#遇见声音魔法:从麦克风到文字的0.1秒奇幻漂流

为什么选300Hz?因为人声基频通常在85-255Hz,但清脆的“啊”可能到2kHz,所以300Hz是安全区!(参考知识库[1])

墨夶的博客 365

LLCC68芯片系统架构与LoRa驱动开发核心解析

LoRa射频收发器是低功耗广域物联网(LPWAN)的关键组件,其本质是集成了调制解调器、协议引擎、数据缓冲区与电源管理的专用SoC。理解其工作模式状态机(Sleep/Standby/TX/RX)与SPI主机接口时序规范,是实现稳定通信的基础。LLCC68通过寄存器映射与命令集双接口抽象硬件控制,支持LoRa扩频调制与FSK兼容模式,具备高链路预算(157 dB)和DC-DC/LDO动态电源切换能力。典型应用场景包括远距离传感器节点、智能表计与工业无线监测系统。本文深入剖析LLCC68的信号链路径、中断机制与

weixin_29859471的博客 281

S3C2440C语言点灯

第一代程序员使用机器码 第二代程序员使用汇编 第三代程序员使用C语言 C语言相较于汇编和机器码是一个更高级的语言,我们使用的技术也应该与时俱进 之前控制寄存器是配置GPFCON和GPFDAT寄存器,通过地址访问,所以可以用C语言来进行对地址的访问。 GPFCON——0x5600,0050 GPFDAT——0x5600,0054 目录S3C2440芯片手册导读用指针表示 S3C2440芯片手册导读 对于GPFCON,只用到了16位 对于GPFDAT,只用到了8位 我们仍然可以以32位,就是4字节的

路人coder 561

(8)(8.19) GPIOs

Ardupilot官网关于《Copter》的翻译 —《(8.19) GPIOs》。

无人机开发(开源Ardupilot) 1万+

sqlite3 C语言编程

sqlite数据库操作例程: #include #include #include int main() { sqlite3 *db; char *zErrMsg = 0; char sql[128]; //存放sqlite执行命令 char buff[1024]; //存放读取到的数据结果 int rc; int len = 0; memset(buff,0,sizeof(b

just do it 2816

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C语言与sqlite3入门

这么做的目的就是在比如插入多个数据,绑定了一个人的数据,然后需要绑定第二个的时候需要清空statement。对于结构相同的语句,我们是否可以先编译,于是有了一个prepare,先编译,再插入变量执行。放入项目的sqlite文件夹中,除开我已经创建的两个数据库,项目结果应该长这样。上面的示例代码中使用了sqlite3_column,这是获取查询到的数据的函数。下面是一个模板的代码,将插入语句设置为模板,其中需要插入的内容用?exec使用起来简单,它在执行的过程中,有一个编译再执行的过程。

iceylia的博客 1801

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c语言编程数组对角线之和,C语言实现3*3数组对角线之和示例

C语言实现3*3数组对角线之和示例我就废话不多说了,直接上代码吧!#define _CRT_SECURE_NO_WARNINGS 1#include#includeint SUM(char arr[][3]){int i = 0;int j = 0;int sum = 0;for (i = 0; i < 3; i++){for (j = 0; j < 3; j++){if (i == ...

weixin_34867823的博客 3658

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C3编译器:现代C语言的革命性进化之路

你是否还在为C语言的预处理器宏、头文件依赖和内存安全问题而头疼?是否渴望一种既保留C语言简洁高效特性,又能提供现代语言便利性的编程语言?C3语言及其编译器正是为此而生! ## 什么是C3语言? C3是一种构建在C语言语法和语义基础上的编程语言,旨在演进C语言的同时保持对C程序员的熟悉度。它不是一场革命,而是一次精心设计的进化。 ### C3的核心设计原则 ```mermaid mindma...

gitblog_00147的博客 1091

使用C语言操作sqlite3

1.对数据库打开操作: SQLITE_API int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 参数: 你要打开的文件名,文件名是一个字符串,需要" " 数据库句柄的地址(指针) 以上函数表示的就是打开这个数据库文件,放入到句柄的中 因为你传递的参数是句柄的地址,因此我可以改变句柄的内容 返回值: 如.

守护 1801

C语言实现HDB3码

2)判断连零的个数,连续4个零的用V码进行二次编码,即在第四个零处加入V码,V码与前一个非零的码元极性相同。2、在利用C语言实现对信源信号进行HDB3码编码时,首先得大致了解HDB3码的实现过程。②优点:编译码简单(AMI-RZ波形,通过全波或者半波整流器,可变为单极性RZ波形)输入:int a[num]={1,0,0,0,0,0,0,0,0,1,1};【AMI编码】①编码规则:0-->0,1-->+1/-1交替出现。输出:-1 0 0 0 -1 1 0 0 1 1 -1。2)V码和B码的编码。

qq_58154778的博客 1245

ev3 c语言高级编程,EV3运行原生C语言程序实例

EV3运行原生C语言程序实例。本帖最后由 ntwuhui 于 2013-9-20 07:58 编辑说明:以下过程直接在EV3系统上编译原生C语言程序,不需要修改固件,Ununtu13.04测试通过,个人觉得此法应该也可以在其他Linux系统下使用硬件需求:- EV- NetGear WNA1100 USB WIFI dongle- MicroSD card下载并安装编译器:wget -c http...

weixin_35703300的博客 1471

KEIL MDK平台 S3C2440 C语言软件仿真

KEIL MDK平台 S3C2440 C语言软件仿真的上机过程KEIL MDK平台 S3C2440 C语言软件仿真的上机过程建立工程,编辑汇编语言程序编译链接源程序调试 KEIL MDK平台 S3C2440 C语言软件仿真的上机过程 本系列博文将从软件仿真开始一步步介绍KEIL MDK平台 S3C2440汇编/c语言程序的编辑、编译、链接、调试过程,以及建立裸机程序、移植ucos操作系统、移植ucGUI的全过程。 本帖将介绍基于KEIL MDK平台 S3C2440 C语言软件仿真的上机过程。包括汇编语言的编

weixin_41551104的博客 1324
上一篇: C语言-2
下一篇: C语言-4
code_stream
博客等级 码龄4年 1238粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值