JNI开发-C语言基础

#include <stido.h>

void change(int * i);//先声明,参数为指针
void change2()

void opreate(void(*change2)(int,int),int c,int d){
    change2(c,d)
}

void main(){ 
    printf("hello world! \n");
    sizeof(int);
    
    /**
     * 1、#include:相当于java的导包操作 例如:#include <stdio.h>
     * <> 代表寻找系统的资源
     * “” 代表寻找我们自己写的资源
     * .h .hpp(声明文件 头文件)
     * .c  .cpp (实现文件)
    **/
    //2、基本数据类型:int、double、float、long、short、char、字符串:char * str = “这是字符串”;
    //sizeof:获取字节数;例:sizeof(int)//int 占几个字节  == 4
    //3、占位符;在c语言中,打印需要占位符
    int num = 1;
    printf("num--> %d\n",num)//%d - 整型
    double num2 = 2.4543534543545435;
    printf("num2--> %if\n",num2)//%if - double和float
    float num3 = 3.45;
    printf("num3--> %f\n",num3)//%if - float
    char num4 = 4;
    printf("num4--> %c\n",num4)//%if - float
    char[] str = "hello world!";
    printf("str--> %s\n",str)//%s - String
    
    //4、指针地址:在C语言中,万物皆指针。指针可以理解为地址。
    //&代表取出地址,例如:int number = 10;printf("此number变量的地址是:%p\n", &number);
    //* 代表取出地址所对应的值 例如:
    int number = 100;printf("number的值是:%d\n", *(&number));//100 
    //&number代表number所对应的地址  *(&number)代表取number地址所对应的值 所以输出100

    //4.2 int * 代表int类型的指针 说明定义的是一个指针变量,就是一个变量而已,只不过是指针的变量而已
    int a = 100;
    int * b = &a;
    //通过指针修改变量值
    a = 88;
    printf("*b = %d",a);//输出88
    *b = 99;
    printf("a的值 = %d",*b)//输出99

    //5、函数(C语言不允许函数重载,C++可以)
    //函数需要先声明再实现,并且,函数不能写在main函数的后面
    int c = 1;
    change(&c)
    //由于C语言不支持函数重载,所以声明的函数,不需要写参数
    int d = 3;
    int e = 6;
    change2(d,e)

    //6、多级指针;是几级指针,取值时,前面就加几个*
    int f = 999;
    int *ff = &f;
    int **fff = &ff;
    int ***ffff = &fff;

    //7、数组与数组指针
    //int [] arr = {1,2,3};//错误写法
    int arr[] = {1,2,3,4};//正确写法
    //数组的内存地址 等于第一个元素的内存地址,不是其他元素的地址
    //上面数组的内存地址可以写为:arr、&arr、arr[0]
    //既然数组是一个地址,那么:
    int * arrP = arr;
    //数组可以用地址变量赋值,操作数组,就是对数组的指针的操作;
    arrP++;//数组指针(下标)+1,
    printf("arrP++ = %d",*arrP)//=2
    arrP += 2;
    printf("arrP = %d",*arrP)//=4
    //数组是连续的内存空间,int数组每次挪动4个字节
    //7.2通过循环给数组赋值
    int arrX = [4];//定义数组
    int *arrxP = &arrX;//赋值给指针
    int j = 0;
    for(j = 0;j<4;j++){
        *(arrxP+j) = i+1;
    }

    //8、函数指针
    void(*method)(int,int)//函数指针
    //void:返回值
    //(*method):函数名
    //(int,int):参数
    opreate(change2,1,2)
    printf("change2函数的指针 = %p = %p",change2,*change2)
    return 0;

    //9、C语言的布尔类型,C语言没有true和false,只有0和非0,0就是false,非0就是true

    //10、静态开辟,在栈区内开辟的内存即称为静态开辟,函数执行完后会弹出栈,释放站内的内存。
    //栈区:占用内存大小最大值:大概2M,大于2M就会溢出,和平台相关的
    //堆区:占用内存大小最大值:大概80% 40M没有任何问题,基本不用担心,堆区很大的。(80%是指Window系统给我们的空间的80%)

    //11、动态开辟,使用malloc函数,动态开辟是在堆区中开辟,函数执行完后不会释放堆空间,所以,我们一定要手动释放free,并把指针指向NULL,避免悬空指针;
    //悬空指针:指针指向一块内存,这块内存使用完被系统回收后,指针任然指向这块内存,就叫”悬空指针“;
    void *p = malloc(size);
    assert(p);//使用assert宏来检查指针p是否为NULL。如果p为NULL,则会触发断言失败,程序会终止执行。这是一种常见的错误处理方式,用于确保分配内存成功。
    free(p);
    //现在p就是悬空指针
    //正确的写法是加上&p = NULL
    p = NULL;

    //11.2野指针
    void *p;//没有被初始化的指针,不确定指针具体指向;
    //因为野指针可能指向任意内存段,所以,它可能损坏正常的数据,也可能引发其他未知错误
    //在实际开发中,一定要避免野指针,可以通过赋值的方式避免:
    void * dd = NULL;
    void * data = malloc(size);
    //11.3动态开辟:
    int * arr8 = malloc(1 * 1024 * 1024)
    free(arr8);
    arr8 = NULL;
    //11.4realloc:扩展空间大小;已经开辟空间的数组,想扩充空间,就使用realloc函数;
    int * arrR = (int *) malloc(5);
    for(int i = 0;i<5;i++){
        (arrR+i) = i + 1000;
    }
    int * new_arr = (int *) realloc(arrR,5+6);
    free(new_arr);
    new_arr = NULL;
   
   //12、struct结构体:在C语言中,结构体相当于java中的类
   //第一种写法:
   struct Dog dog;
   //第二种写法:
    // struct Cockroach{//小强
    //     char * name;
    //     int age;
    //    char sex;
    // } person = {"小强",0.1,'G'};

   strcpy(dog.name,"旺财");
   dog.age = 6;
   dog.sex = 'G';
   struct Dog dog2 = {"小白",4,'雄'};
   //12.2结构体指针
   struct Dog * dogp = &dog2;
   dogp->age = 2;
   strcpy(dogp->name,"小黄");
   printf("姓名 = %s、年龄 = %d、性别 = %c",dogp->name,dogp.age,dogp.sex);
   printf("姓名 = %s、年龄 = %d、性别 = %c",dog2.name,dog2.age,dog2.sex);//这样写可以吗?
   //12.3结构体指针与动态内存开辟
   struct Dog *dog = malloc(sizeof(Dog));
   strcpy(dog->name,"大黄");
   dog->age = 3;
   dog->sex = '雌';

   free(dog);
   dog = NULL;
   //12.4结构体取别名:
   typedef struct Dog_Xiaohuang; // 给结构体取别名
   typedef Xiaohuang * XH2;//给结构体指针取别名
}


struct Dog
{
    /* data */
    char name[10];
    int age;
    char sex;

};//必须要在最后写;

struct Cockroach{//小强
    char * name;
    int age;
    char sex;
} person = {"小强",0.1,'G'};

void change(int * i){
    *i = 66;
}

void change2(int * a,int * b){
    int temp = *a;
    int *a = *b;
    int *b = temp;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值