首页 > 其他分享 >C语言学习一

C语言学习一

时间:2023-06-09 17:56:51浏览次数:39  
标签:arr struct int C语言 学习 内存 数组 指针

初识C 在C中 内存地址<==> 指针地址 int main(){ int number = 100; //实际是 number(int ) = 100,number是别名 return NULL; } main函数进栈,return 出栈 注意:&number 读取内存地址 *(&number) 取出number地址对应的值 :100 int main(){ int number = 100;//实际变量的声明 int *intP= &number;//指针变量 *intP ,并在指针变量中存入 var的地址 //intP是别名 它表示:int类型的指针 //实际是 intP(int*) = 指针[内存地址] //intP:指针别名; int* : int类型的指针 //int *intP;表示一个int类型的指针;也是一个指针变量 return NULL; } *intP:取出intP存放的内存地址的对应值:100 int i= 100; int *p = &i;//指针变量地址赋值为 i的地址 *p =300;// //实际是 i(int) =100 p(int * ) = 内存地址XXXXXX; *p = 内存地址XXXXXX 对应的值 修改为 300; 注意: C不允许函数重载,C++可以   数组指针 int main(){ int arr[] = {1,2,3,4}; int *p = arr; int i = 0; printf("数组默认指针以第一个元素为准:%p\n", &arr); for(i = 0; i < 4;++i){ printf("数组第%d个元素的指针%p\n", i,&arr[i]); printf("数组第%d个元素的值%d\n", i,arr[i]); } return 0; } //log: 数组默认指针以第一个元素为准:0x7ffcec308b40 数组第0个元素的指针0x7ffcec308b40 数组第0个元素的值1 数组第1个元素的指针0x7ffcec308b44 数组第1个元素的值2 数组第2个元素的指针0x7ffcec308b48 数组第2个元素的值3 数组第3个元素的指针0x7ffcec308b4c 数组第3个元素的值4 数组的长度 .....省略上文 int length = sizeof(arr) / sizeof(arr[0]); printf("数组长度为: %d\n", length); // 输出: 数组长度为: 4   函数指针 #include <stdio.h> void add(int num1, int num2){ printf("add: num1 + num2 = %d\n",(num1 + num2)); } void opreate(void(*method)(int,int),int num1,int num2){ method(num1, num2); printf("opreate函数中的参数method,即函数指针的地址%p\n",method); } int main(){ opreate(add, 1,2); printf("add函数的指针地址%p\n",add); } 这里 *method:传入类型是(int,int)的函数指针变量   0 常量指针、指针常量、函数指针 字符串

  • strcpy(s1, s2); //复制字符串 s2 到字符串 s1。
  • strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。
  • strlen(s1); 返回字符串 s1 的长度。
  • strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1s2 则返回大于 0。
  • strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
  • strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
结构体 结构体必须使用 struct 声明 #include <stdio.h> #include <stdlib.h> #include <string.h> struct Cat{ char name[10]; int age; }; int main(){ //静态开辟,属于栈空间 struct Cat cat[10] ={ {"小花",1},{"小黑",2}, {"肥宅",3}, {}, {}, {}, {}, {}, {}, {} }; struct Cat cat6 = {"猫6",6}; cat[6] = cat6;// 等价于 *(cat +6)= cat6; int i = 0; for(i == 0; i< 10; i++){ printf("cat数组第%d个元素的值 %s\n",i,cat[i].name); } //动态开辟,属于堆空间 struct Cat *cat2 = malloc(10 * sizeof(struct Cat) ); printf("cat2数组的长度%d\n",sizeof(struct Cat)/sizeof(cat2); return 0; } init main(){ //静态开辟,属于栈空间 struct Cat cat[10] ={ {"小花",1},{"小黑",2}, {"肥宅",3}, {}, {}, {}, {}, {}, {}, {} } struct Cat cat9 = {"猫6",6}; cat[9] = cat9;// 等价于 *(cat +9)= cat9; //动态开辟,在堆内存中开辟 struct Cat cat2 = malloc(sizeof(struct Cat) * 10); //给第一个元素赋值 strcpy(cat2->name,"猫2"); cat2->age = 1; //给第七个元素赋值 cat2 +=6; strcpy(cat2->name,"猫777"); cat2->age = 7; //释放内存 free(cat2); cat2= NULL: }   静态开辟 int main(){ int arr[1*1024*1024];//会栈溢出导致崩溃 //在大部分平台,栈区的内存大小 大概在 2M } 动态开辟 栈区的内存地址 指向 堆区的内存空间,多采用malloc,和realloc malloc: 动态开辟一个 int类型,长度为5的空间 int * arr = (int *) malloc(sizeof(int) * 5); for(int i=0; i< 5; ++i){ arr[i]= (i+1001); //arr[i] 等价于 *(arr+i) } //动态开辟的内存在堆区,必须手动释放,调用 freee(void *); arr = NULL;//释放内存时必须同时指向NULL的 指针,否则会造成 悬空指针 realloc: 在已经存在的指针后边,创建一个有长度的空间 realloc(void*,size);//第一个参数是指针,第二个参数是总的长度 创建时会出现2中情况:1 传入指针地址仍然存在且内存够用,在后边继续创建; 2 内存不够回收了,第一个指针指向的对象被拷贝到新的地址,然后在后边继续创建剩余空间   printf打印时,需要配合‘\0’ 否则将会打印一堆乱码【系统值】,‘\0’是为printf识别终止打印标识 atoi: 将string转为int atof: 将string转为double     结构体指针 typedef 仅限于为类型定义符号名称,它是由编译器执行解释的 typedef 取别名,为了在不同软件上兼容写法,一定要在结构体前加此关键字 typedef struct Worker_; typedef Worker_ * Worker; struct Worker{ char name[10]; int age; char sex; } typedef struct Worker Worker_ ; typedef Worker_ * Worker; //匿名结构体别名,这样写意义不大 typedef struct { char name[10]; int age; char sex; } //大多数源码的写法 //给结构体AV 取了一个别名 等于AV typedef struct { char name[10]; int age; char sex; } AV; init main(){ Worker worker = malloc(sizeof(Worker_)); Av av ={}; } 文件的读写 #include <stdio.h> #include <stdlib.h> // 文件的操作,是在这个头文件里面的 #include <string.h> char * readFileName = "/Users/edy/Desktop/xxx.json"; char * writeFileName = "/Users/edy/Desktop/xxxWrite.json"; FILE * decodeFile = fopen(readFileName,"rb"); FILE * encodeFile = fopen(readFileName,"wb"); if(!decodeFile || !encodeFile){ exit(0); } int buffer[512]; int len; //fread 入参 1:buffer 2: 每次偏移多少 3: 读取的文件 while(len = fread(buffer,sizeof(int),512,file) != 0){ fwrite(buffer,sizeof(int),encodeFile); } //file关闭流 fclose(decodeFile); fclose(encodeFile); 获取文件的大小 #include <stdio.h> #include <stdlib.h> // 文件的操作,是在这个头文件里面的 #include <string.h> char * readFileName = "/Users/edy/Desktop/xxx.json"; FILE * decodeFile = fopen(readFileName,"rb"); if(!decodeFile){ exit(0); } //将指针从文件第一个位置挪动到最后 fseek(decodeFile,0,SEEK_END); //ftell记录当前指针挪动后的偏移字节数量 long fileSize= ftell(decodeFile); fclose(decodeFile); 文件加密、解密 int c; while((c = fgetc(file))!= EOF){ fputc(c ^ 5,file); } fclose(file);     C 语言中常用的内存管理函数和运算符
  • malloc() 函数:用于动态分配内存。它接受一个参数,即需要分配的内存大小(以字节为单位),并返回一个指向分配内存的指针。
  • free() 函数:用于释放先前分配的内存。它接受一个指向要释放内存的指针作为参数,并将该内存标记为未使用状态。
  • calloc() 函数:用于动态分配内存,并将其初始化为零。它接受两个参数,即需要分配的内存块数和每个内存块的大小(以字节为单位),并返回一个指向分配内存的指针。
  • realloc() 函数:用于重新分配内存。它接受两个参数,即一个先前分配的指针和一个新的内存大小,然后尝试重新调整先前分配的内存块的大小。如果调整成功,它将返回一个指向重新分配内存的指针,否则返回一个空指针。
  • sizeof 运算符:用于获取数据类型或变量的大小(以字节为单位)。
  • 指针运算符:用于获取指针所指向的内存地址或变量的值。
  • & 运算符:用于获取变量的内存地址。
  • * 运算符:用于获取指针所指向的变量的值。
  • ->运算符:用于指针访问结构体成员,语法为 pointer->member,等价于 (*pointer).member。
  • memcpy() 函数:用于从源内存区域复制数据到目标内存区域。它接受三个参数,即目标内存区域的指针、源内存区域的指针和要复制的数据大小(以字节为单位)。
  • memmove() 函数:类似于 memcpy() 函数,但它可以处理重叠的内存区域。它接受三个参数,即目标内存区域的指针、源内存区域的指针和要复制的数据大小(以字节为单位)。
    面试题:函数和方法有什么区别 答:函数是没有Receiver的,方法有Receiver,而且是默认持有的第一个参数 fun main(){ val :() -> Unit = ::fun01 val : A.() -> Unit = A::fun02 // A 就是Receiver } fun fun01(){ //返回类型是 () -> Unit pringln("这是一个函数") } class A { fun fun02(){ //返回类型是 (Receiver) -> Unit pringln("这是一个方法") } }  
 

标签:arr,struct,int,C语言,学习,内存,数组,指针
From: https://www.cnblogs.com/wangybs/p/17469891.html

相关文章

  • 前端学习C语言 - 开篇
    前端学习C语言-开篇前端学习C语言有很多理由:工作、兴趣或其他。C语言几个常见的使用场景:操作系统开发:Linux操作系统的内核就是主要由C语言编写的。其他操作系统也广泛使用C语言进行核心部分的开发。系统级开发和嵌入式编程:C语言具有强大的底层控制能力和高效的代码......
  • 【翻译】使用深度强化学习发现更快的排序算法
    目录Fastersortingalgorithmsdiscoveredusingdeepreinforcementlearning将算法表示为低级CPU指令DRLfordiscoveringfasteralgorithmsTransformerencoderLatencyvaluefunctionsResultsDiscoveringfastersortalgorithmsFixedsortingalgorithmsVariablesorting......
  • vue学习记录 2
    打开昨天的vue项目,没记错的话网上查到的信息说,代码编辑部分就只在src文件夹,包括asset,router和components,其他的全是配置文件。项目新建默认是一个巨大的vue图标和两行链接,布局在HelloWorld.vue,但是我昨天还没找到那个名为logo.png的图标是哪里插进去的。今天先摸清页面,然后做一......
  • 「学习笔记」DP 学习笔记1
    序列DP一般序列DP核心思想:将序列的前\(i\)个数的状态用一个更简单的形式表示出,并且体现出这些状态对后续的影响。题目ABC267D给定一个序列\(a\),找到一个长度为\(m\)的子序列\(b\),使得\(\sumb_i×i\)最大。\(n,m\le2×10^3\)。状态:\(f(i,j)\):前\(i......
  • Postman 中 GraphQL 教程:快速入门学习
    GraphQL是一种用于API的开源数据查询和操作语言,用于API的查询语言和运行时。它使客户端能够精确地指定其数据需求,并获得预测性地结果。GraphQL旨在提高API的效率、灵活性和可靠性。Postman是一款用于API开发的强大工具,它支持REST和GraphQLAPI。Postman还提供了一个用户友好的界面,......
  • 011 数据库学习笔记--游标
    游标:定义:游标是对数据查询结果集的一种访问机制,允许用户对结果集进行逐条访问,即单条数据。访问对象是,结果集可以理解为定义在特定结果集上的指针,控制这个指针,遍历数据集或制定特定的行--对其进行读取或写入作用:定位到结果集中的某一行,对当期位置的数据进行读写数据读取......
  • 一定要收藏的PKPM学习笔记
    01裂缝与挠度裂缝,模型里计算裂缝是按矩形截面计算弯矩,而不考虑翼缘影响,实际上翼缘影响是很大的,也就是说模型计算出的结果裂缝偏大,一般梁支座裂缝不考虑,因为本来强柱弱梁也是要出现塑性铰的,但是梁底部裂缝要考虑,而且梁尤其是KL底筋配筋结果最好比计算结构稍大,也就是弯矩调幅0.8而不......
  • 强化学习On-policy vs Off-policy
    强化学习On-policyvsOff-policy这里我们讲讲强化学习中on-policy和off-policy的区别。实际上这个区别非常简单,就是说如果算法在更新它的policy的时候,它是依赖于前面的Qvaluefunction的话,那么它就是on-policy的。反之如果它是依赖于随机的一个输入或者人为的操控,那么它就是一个......
  • 非科班自学计算机需要学习什么内容?
    文章目录前言一、方向>语言的选择1.1语言vs方向1.2重要观点!二、自学方法另外说到计算机相关基础推荐书籍:三、自学资源前言非计算机专业,又想通过自学找到计算机相关工作的同学还是很多的。并且这条路也是可行的,毕竟计算机专业的同学也要自学。一、方向>语言的选择其实在校生如果......
  • 音标学习——1
                         ......