C
Sun_Shine_999
深度理解是快乐的源泉。
展开
-
链表题
1.交换一个单链表的首尾。#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct node{ int value; struct node *next;}NODE;NODE *swtch(NODE *h){ NODE *head = h,*tailpre = h,*tmp; if(!head) return NULL; //拿到末尾的和末尾前一个nod原创 2021-02-27 23:33:38 · 84 阅读 · 0 评论 -
任意数据的大小端转换
8个字节的长度限制需要注意。#include <stdio.h>typedef unsigned long u64;void convert_func(unsigned long val){ //unsigned int a = 0, b = 0, c = 0, d = 0; unsigned long i = 0,j = 0; unsigned long length = 0,h_length = 0; unsigned long result = 0,resul原创 2020-06-09 01:17:38 · 658 阅读 · 0 评论 -
typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针
首先介绍大家比较熟悉的typedef[cpp] view plain copy int i;//定义一个整型变量i typedef int myInt; myInt j;//定义一个整型变量j 上面介绍得是我们常用的比较简单的typedef的用法,下面首先介绍一下函数指针。函数指针的形式:****形式1:返回类型(*函数名)(参数表)**** [cpp] view ...转载 2018-06-01 09:38:12 · 238 阅读 · 0 评论 -
C语言可变参数以及printf()、sprintf()、vsprintf() 的区别与联系
转载自:https://blog.csdn.net/raito__/article/details/48860119printf() 在控制台应用程序中最为常用,使用也很简单。其参数为格式化字符串。函数原型:printf(const char *format,[argument]);例如:int a=1,b=2; printf("a=%d,b=%d",a,b); 输...转载 2018-06-12 11:44:51 · 568 阅读 · 0 评论 -
#ifndef预编译
需要注意的是,#ifndef起到的效果是防止一个源文件两次包含同一个头文件,而不是防止两个源文件包含同一个头文件。网上很多资料对这一细节的描述都是错误的。事实上,防止同一头文件被两个不同的源文件包含这种要求本身就是不合理的,头文件存在的价值就是被不同的源文件包含。假如你有一个C源文件,它包含了多个头文件,比如头文件A和头文件B,而头文件B又包含了头文件A,则最终的效果是,该源文件包含了两次...原创 2018-04-07 17:39:27 · 379 阅读 · 0 评论 -
C语言之位段使用详解
1、什么是位段在前面各章中, 我们已经讨论过字节概念了。在大多数的计算机系统中, 一个字节是由八个更小的, 称作为位的单位组成的。位是比字节更小的单位。位只有两个值, 1 或 0 。因此, 存储在计算机存储器中的一个字节可以看成由八个二进制数字形成的串。例如, 一个存放值 36 的字节是八个二进制数字的串: 可以表示成 00100100。 存入值24 的字节可以表示成 00010100。有时, 我们翻译 2018-03-24 16:31:49 · 438 阅读 · 0 评论 -
浅谈c语言代码段 数据段 bss段 堆栈
代码段、数据段、bss段(1)编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分。(2)代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的。(3)数据段(也被称为数据区、静态数据区、静态区):数据段就是程序中的数据,直观理解就是C语言程序中的全局变量。(注意:全局变量才算是程序的数据,局部变量不算程序的数据,只能算是函原创 2018-03-24 16:06:45 · 1059 阅读 · 0 评论 -
(1)c关键字
一、数据类型 数据类型的本质可以理解为固定内存大小的别名 二、变量本质 变量是一段实际连续存储空间的别名 程序中通过变量来申请并命名存储空间 通过变量的 名字可以使用存储空间三、关键字 c语言中的变量可以有自己的各种不同的属性 在定义变量的时候可以加上“属性”关键字 “属性”关键字指明变量的特有意义 1.auto auto即c语言中局部变量的默认属性,编译器默认所有的局部变...原创 2016-06-26 17:24:53 · 275 阅读 · 0 评论 -
C语言实现字节流与十六进制字符串的相互转换
在调试串口经常碰到需要把读出来的hex data转化成string类型输出,记录下来//字节流转换为十六进制字符串void ByteToHexStr(const unsigned char* source, char* dest, int sourceLen){ short i; unsigned char highByte, lowByte; for (i =...原创 2018-07-20 19:13:28 · 8444 阅读 · 2 评论 -
内存溢出
惨痛的教训: 1, 发现系统运行到某一地方会重启 2,全局变量被莫名的修改导致上述的现象的原因是: 内存溢出.而查找更是钻牛角尖. 导致内存溢出是因为: 1.多处用了strcat拼接数组 2.用hextostring函数,数组越界,src的长度大于了dest. 解决办法:用strncat指定固定长度,可以确保不出现预料不到的现象....原创 2018-07-27 19:48:08 · 184 阅读 · 0 评论 -
C函数之memcpy()函数和strcpy函数的区别
函数原型void *memcpy(void*dest, const void *src, size_t n);功能由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。头文件#include<string.h>返回值 函数返回一个指向dest的指针。说明 1.source和destin所指内存区域不能重...原创 2018-08-10 11:32:16 · 839 阅读 · 0 评论 -
typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针
首先介绍大家比较熟悉的typedefint i;//定义一个整型变量itypedef int myInt;myInt j;//定义一个整型变量j上面介绍得是我们常用的比较简单的typedef的用法,下面首先介绍一下函数指针。函数指针的形式:形式1:返回类型(*函数名)(参数表) #include <iostream>using namespace...转载 2018-08-10 13:36:26 · 2581 阅读 · 0 评论 -
Linux下gcc编译生成动态链接库*.so文件并调用它
https://blog.csdn.net/flyztek/article/details/73612469动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。1、动态库的编译下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:s...转载 2018-10-19 13:34:43 · 4798 阅读 · 1 评论 -
getchar和EOF
EOF在windows下为ctrl+z;在ubuntu下为ctrl+d;值为-1; EOF的作用也可以总结为:当终端有字符输入时,Ctrl+D产生的EOF相当于结束本行的输入,将引起getchar()新一轮的输入;当终端没有字符 输入或者可以说当getchar()读取新的一次输入时,输入Ctrl+D,此时产生的EOF相当于文件结束符,程序将结束getchar()的执行。1...原创 2018-01-07 23:03:50 · 716 阅读 · 0 评论 -
sizeof与strlen的区别
char str[20]=”0123456789”; int a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0’为字符串结束标记。 int b=sizeof(str); /*b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响==================================...翻译 2018-03-24 13:08:49 · 162 阅读 · 0 评论 -
回车 换行
在不同系统下,对于“Enter”的含义不同: linux/unix : \n=newline=0x0A=LF(line Feed)=换行 Windows/Dos: \r\n=0xoD 0x0A=CR LF=回车 换行原创 2016-07-01 15:15:27 · 259 阅读 · 0 评论 -
c语言指针做参数的优点
首先要认识函数传参是怎么进行的函数传参是复制形的,举个例子说:void modify(int a) { a++; }void main() { int a=5; modify(a); printf(“%d”,a); } 这个程序的答案还是5。为什么? 因为当调用modify(a)时,在执行modify函数时,是另外开辟了一个内存空间,将main中a的值复制过来,modify函数中转载 2016-07-25 13:29:19 · 3599 阅读 · 0 评论 -
c语言函数指针的作用
1 #include<stdio.h> 2 int arr(int a,int b){return 0;}//比如说是函数1 3 int brr(int a,int b){return 1;}//比如说是函数2 4 int main() 5 { 6 int (*frr)(int,int); //这里转载 2016-07-25 13:39:33 · 416 阅读 · 0 评论 -
条件编译
1:ifdef DEV......else......endif2:ifndef DEV.......else.......endif3:ifndef DEV#define DEV/*头文件其余部分*/endif4:if DEV==1/*头文件*/elif DEV==2/*头文件*/elif DEV==3/*头文件*/else/*头文件*/endif原创 2016-07-07 22:24:38 · 249 阅读 · 0 评论 -
break,continue,return
break:break语句通常用在循环语句和开关语句中,当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句, 通常break语句总是与if语句联在一起,即满足条件时便跳出循环。 cotinue:语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。 return:语句是将函数的值返回主调函数,结束函数。原创 2016-07-19 20:25:31 · 256 阅读 · 0 评论 -
c文件操作函数
1.文件类型指针:typedef struct{ short level; unsigned flags; char fd; short bsize; unsigned char* buffer; unsigned char* curp; unsigned istemp; short token;}FILE;2.打开文件fopen(原创 2016-07-27 13:37:07 · 235 阅读 · 0 评论 -
字符串截取后n个字节
#include<stdio.h>#include<stdlib.h>char* substring(char* ch, int pos, int length){ char* pch = ch; //定义一个字符指针,指向传递进来的ch地址。 char* subch = (char*)calloc(sizeof(char), length + 1); //通转载 2016-07-11 16:15:44 · 728 阅读 · 0 评论 -
arduino gps
#include <LGPRS.h>#include <LGPRSClient.h>#include <LGPRSServer.h>#include <LGPS.h> char server[]="narando.tpddns.cn"; //server ipint port = 8010; //server portString stringSix;原创 2016-07-11 16:41:06 · 1752 阅读 · 1 评论 -
关键字const的含义
#include<stdio.h> #include<string.h>int main(){ char *p = "12345678";; char p1[80] = {0}; char buf[100] = { 0 }; memcpy(p1,p,strlen(p)); puts(p1); sprintf_s(buf,"%s%s",p,p1);转载 2016-07-10 13:41:37 · 489 阅读 · 0 评论 -
C语言中内存分配
在任何程序设计环境及语言中,内存管理都十分重要。在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的。因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题。第1节主要介绍内存管理基本概念,重点介绍C程序中内存的分配,以及C语言编译后的可执行程序的存储结构和运行结构,同时还介绍了堆空间和栈空间的用途及区别。第2节主要介绍C语言中内存分配及释放函数、函数的功能,以及如何调用这些函数申请/释放内存转载 2016-08-16 20:46:52 · 254 阅读 · 0 评论 -
notebook
定义:我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能而执行的相应的操作,这个相应的操作也叫算法。 数据结构:数据怎么存储 算法:数据怎么操作。 数据结构=个体 + 个体的关系 算法 = 对存储数据的操作。程序=数据的存储+数据的操作+可以被计算机执行的语言 软件运行与内存关系(垃圾数据): 内存是在操作系统的统一管理原创 2016-08-05 17:42:51 · 336 阅读 · 0 评论 -
接续符
C 语言里以\表示断行,编译器会将\剔除掉,跟在\后面的字符自动接续到前一行。注意:反斜杠之后不能有空格(否则编译不过),反斜杠的下一行之前也不能有空格,否则空格也连进去了,且看如下程序:#include<stdio.h> int main() { char str1[] ="abc\ def"; char str2[转载 2016-08-31 17:00:24 · 443 阅读 · 0 评论 -
KR_C
变量的声明还可以紧跟在任何其他标识符复合语句开始的左花括号之后。以这种方式声明的变量可以隐藏程序块外与之同名的变量,他们之间没有任何关系,并在与左花括号匹配的右花括号出现之前一直存在。 #include<stdio.h> 2 3 int main() 4 { 5 int i = 0, ***int j = 5;*** 6 for (i=0原创 2016-09-07 11:12:02 · 397 阅读 · 0 评论 -
linux 文件操作
在shell应用中,重定向的操作就是修改了输入/输出流。 根据应用的不同需要,ANSI 标准提供了3种类型的I/O处理函数,包括字符读写,行读写和块读写。如果使用了缓冲区,则不需要每次进行标准IO处理时都使用系统调用,至于什么时候使用系统IO调用则由缓冲区类型及缓冲区中的数据量决定原创 2016-10-18 20:20:51 · 269 阅读 · 0 评论 -
检测大小端
可以使用共用体来检测当前系统的大小端,其借助了共用体的存放顺序的特点:即所有成员都从低地址开始申请空间。#include<stdio.h>#include<stdlib.h>union word{ int a; int b;}c;//如果c.a申请内存地址为0x4000-0x4003,则无论是哪种系统,c.b访问的地址空间始终为0x4000.int checkCPU(vo原创 2016-09-21 11:54:05 · 229 阅读 · 0 评论 -
从内存角度深入看结构体(window/linux)大小
今天我们来看一下windows(32, 64)(dev-c++,vc),linux(32, 64)不同系统下,它们求结构体大小时,编译器到底给它们分配了哪些内存,又为什么这样分配,为啥子编译器给它们有时空闲3个内存块,有时候又空闲7个内存块,为什么啊,为什么啊当你们读了上面的内容,还想继续往下看的时候,就说明你开始关注内存的分配问题了,哈哈!!!关于内存对齐:简单地理解就是:程转载 2018-01-15 19:08:38 · 553 阅读 · 1 评论