#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;
}
JNI开发-C语言基础
于 2024-03-25 16:31:41 首次发布