![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C
小时候挺菜
这个作者很懒,什么都没留下…
展开
-
翻转链表的方法
前两天看到一个题目,将链表反转,我的第一思路是将列表放入栈中,然后再依次拿出来。思想过于简单,我想到说利用数组来实现这个功能。之后查看网上各种大神的方法,做以下几个方法总结。一、放入数组,数组倒置void reverse(pnode head, int count)//把链表的节点值放在数组中,倒置数组{ int a[5]= {0}; for(int i=0; i...转载 2018-11-26 19:58:30 · 130 阅读 · 0 评论 -
CRC校验原理及步骤
来源:https://blog.csdn.net/d_leo/article/details/73572373什么是CRC校验?CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。...转载 2018-08-14 10:50:00 · 992 阅读 · 0 评论 -
C语言文件操作
C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有: 文件的打开操作 fopen 打开一个文件 文件的关闭操作 fclose 关闭一个文件 文件的读写操作 fgetc 从文件中读取一个字符 fputc 写一个字符到文件中去 fgets 从文件...转载 2018-08-14 17:38:00 · 120 阅读 · 0 评论 -
C语言移位
先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如:int i = 1;i = i << 2; //把i里的值左移2位也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成 000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的...转载 2018-08-15 16:32:00 · 303 阅读 · 0 评论 -
指针的加减操作
#include <stdio.h>int main(){ //测试指向结构体的指针自减后地址的变化 typedef struct Student { int id; char name[10]; int score; }stu; stu a = { 1, "xiaoming", 33 }; printf("结构体的大小为%d\n", sizeof(a)...原创 2018-08-17 15:04:00 · 762 阅读 · 0 评论 -
测试结构体的大小
#include <stdio.h>int main(){ //测试结构体大小 typedef struct Student { int id; char name[10]; int score; }stu; printf("结构体Student的大小为%d\n", sizeof(Studen...原创 2018-08-17 15:25:00 · 418 阅读 · 0 评论 -
移位
//测试移位#include <stdio.h>int main(){ //测试存储数据的方式:补码 int a = -1; unsigned int b = 1U; printf("有符号数a的值是%x\n", a); printf("无符号数b的值是%x\n", b); //测试原码左移 a = a <<...原创 2018-08-17 16:09:00 · 152 阅读 · 0 评论 -
C语言操作数截断
//测试截断#include <stdio.h>int main(){ int a = 0x80000001; unsigned int b = 0x80000001; printf("有符号数a的值是%d\n", a); printf("无符号数b的值是%x\n", b); //有符号数与无符号数的截断 short ...原创 2018-08-17 16:48:00 · 2715 阅读 · 0 评论 -
深入理解void以及void指针的含义
void的含义 void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。void指针使用规范 ①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。例如: int *pint; void *pvoid; pvoid = pint; /* 不过不能 pint = pvoid; */ 如果要将pvoid赋给其他类型指针,则需要强制类型转换如:pin...原创 2018-08-18 12:43:00 · 821 阅读 · 0 评论 -
数组指针加1的结果
一般而言,对指针进行加1操作,得到的将是下一个元素的地址,一个类型为T的指针移动,是以sizeof(T)为移动单位。#include<stdio.h>int main(){ int a[5]={1,2,3,4,5}; int b[100]; int *ptr=(int*)(&a+1); //&a...原创 2018-07-30 21:05:00 · 1009 阅读 · 0 评论 -
C语言回调
来源:https://www.cnblogs.com/jiangzhaowei/p/9129105.html1. 什么是回调函数?回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义。我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类似这么一个场景来说明:A君去B君店里买东西,恰好缺货,A君留下号码给B君,有货时通知A...转载 2018-07-30 15:12:00 · 176 阅读 · 0 评论 -
数组作为形参的使用
来源:https://www.cnblogs.com/weixiaoyu/p/4371806.html1、对于一维数组来说,数组作为函数参数传递,实际上传递了一个指向数组的指针,在c编译器中,当数组名作为函数参数时,在函数体内数组名自动退化为指针。此时调用函数时,相当于传址,而不是传值,会改变数组元素的值。例如:void fun(int a[]); 若在fun函数中有a[i]++;等...转载 2018-07-30 13:08:00 · 24599 阅读 · 0 评论 -
经典C语言编程注意点
C/C++程序员应聘试题剖析1.引言 本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。 许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己...转载 2017-09-14 11:42:03 · 287 阅读 · 0 评论 -
数组首地址的理解
int a[4]={1,2,3,4};&a为数组的首地址,a为数组的首元素的首地址&a+1为加一整个数组a的大小a+1为加数组a一位的大小原创 2018-07-17 15:08:00 · 1522 阅读 · 0 评论 -
C语言位域
来源:http://www.runoob.com/cprogramming/c-bit-fields.html如果程序的结构中包含多个开关量,只有 TRUE/FALSE 变量,如下:struct{ unsigned int widthValidated; unsigned int heightValidated;} status;{ unsigned int width...转载 2018-07-18 16:43:00 · 84 阅读 · 0 评论 -
C语言中头文件尖括号和引号的区别
用include 引用头文件时,双引号和尖括号的区别:1.双引号:引用非标准库的头文件,编译器首先在程序源文件所在目录查找,如果未找到,则去系统默认目录查找,通常用于引用用户自定义的头文件。2.尖扩号:只在系统默认目录(在Linux系统中通常为/usr/include目录)或者尖括号内的路径查找,通常用于引用标准库中自带的头文件。综上,标准库自带的头文件既可以用双引号也可以用尖括号,不...原创 2018-07-24 17:00:00 · 6656 阅读 · 0 评论 -
C语言程序设计:现代方法阅读笔记
第二十六章 atexit函数允许用户“注册”在程序终止时要调用的函数:atexit(func); 在程序终止后,func函数会被自动调用 clock()函数可以计算程序运行时间 time函数返回当前的日历时间,返回类型是time_t 第二十四章 void assert(expression); 如果返回非0,则正常运行,如果返回0,则会向stderr返回一条消息...原创 2018-07-24 19:50:00 · 291 阅读 · 0 评论 -
const int *a与int *const a,const int *const a的区别
来源:https://blog.csdn.net/zhangheng837964767/article/details/33783511关键问题点:const 属于修饰符 ,关键是看const 修饰的位置在那里1、const int *a这里const 修饰的是int,而int定义的是一个整值因此*a 所指向的对象 值 不能通过 *a 来修改,但是 可以重新给 a 来赋值,使其指向不同的...转载 2018-07-26 14:07:00 · 145 阅读 · 0 评论 -
C语言中数据类型的字节数
类型 16位 32 位 64位 char 1 1 1 short int 2 2 2 int 2 4 4 unsigned int 2 4 4 float 4 4 4 double 8 8 8 long 4 4 8 l...原创 2018-07-30 12:54:00 · 279 阅读 · 0 评论 -
数组名作为函数参数以及sizeof用法
来源:https://blog.csdn.net/jay_zhouxl/article/details/51745518int f(int *p,char *a){ printf("p[2]=%d,*(p+2)=%d\n",p[2],*(p+2)); printf("a[2]=%c,*(a+2)=%c\n",a[2],*(a+2)); printf("sizeof(p...转载 2018-07-30 13:00:00 · 801 阅读 · 0 评论 -
C语言多线程
引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多 为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题。 使用...转载 2018-08-23 19:33:00 · 1409 阅读 · 0 评论 -
C语言多线程编程
介绍:什么是线程,线程的优点是什么线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local stora...转载 2018-08-23 20:33:00 · 280 阅读 · 0 评论 -
__weak修饰符
前言在 HAL 库中,很多回调函数前面使用__weak 修饰符。 weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会...原创 2018-10-29 13:54:00 · 721 阅读 · 0 评论 -
weak和alias
一、强符号和弱符号在C语言中,如果多个模块定义同名全局符号时,链接器认为函数和已初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号。根据这个定义,Linux链接器使用下面的规则来处理多重定义的符号名:1.不允许有多个同名的强符号2.如果有一个强符号和多个弱符号同名,那么选择强符号3.如果有多个弱符号同名,有些编译器从这些弱符号中任意选择一个,有些编译器选...原创 2018-10-31 15:34:00 · 771 阅读 · 0 评论 -
计算结构体偏移量
如果能够让(unsigned long)(&(type))的值为0,即&(type) == 0的时候,那么offset的值就是简单的:offset = (unsigned long)(&(type.c));如果说&(type) == 0,那么type.c就可以等价于((Type_t *)0)->c。但是这个语句是不能单独存在的,因为对NULL指针...原创 2018-11-01 11:08:00 · 259 阅读 · 0 评论 -
C语言变量名转字符串的方法
C语言中将变量名转换成字符串使用的是#符号,来看下边两个宏定义:#define name2str(name) (#name)#define print_val(x) printf(#x" = %d\n", x)使用的时候自动将相应的变量名转换成字符串,示例代码:int main(){ int a = 10; short b = 11; char c = ...转载 2018-11-08 11:22:00 · 4048 阅读 · 0 评论 -
函数不定参数个数的实现
1. C语言函数的调用方式 _cdecl 调用_cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈所以在函数调用栈中, 越右边的参数在栈的越低端,既内存地址越大。2.实现函数如何实现不定参数:由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C...原创 2018-11-08 11:32:00 · 1277 阅读 · 0 评论 -
C语言过程活动记录
C 语言自动提供的服务之一就是跟踪调用链——哪些函数调用了哪些函数,当下一个return语句执行后,控制将返回何处等。解决这个问题的经典机制是堆栈中的活动记录。当每个函数被调用时,都会产生一个过程记录(或者类似的结构)。过程活动记录是一种数据结构,用于支持过程调用,并记录调用结束以后返回调用点所需要的全部信息。每当有一个函数调用时,就会在堆栈(Stack)上准备一个被称为AR(activa...原创 2018-11-08 21:12:00 · 1259 阅读 · 0 评论 -
setjmp()和longjmp()函数
之前我们讲到了过程活动记录(AR),那么如何来操纵AR呢,一个可能的方法是,根据局部变量的地址进行推算,例如对于上面的a函数,执行a函数时的当前AR地址就是参数i的地址偏移8个字节,也就是 ((char*)&i) - 8。然而,不同的C编译器,以及不同的硬件平台都会产生不同的AR结构布局,甚至在一些平台上,AR根本不会存放到Stack中(也可能放在寄存器里,这样运行速度更快一点)。所以...原创 2018-11-08 21:23:00 · 262 阅读 · 0 评论 -
不要在.h文件中定义变量
今天在头文件.h中初始化了一个数组和函数,在编译的时候提示这个数组和函数重新定义了,检查后发现,犯了一个致命的错误,在头文件中定义变量。。。以下引用别人的一篇说明,警示自己。 C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能,C语言模块化程序设计需理解如下概念: (1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明; (...原创 2018-11-15 13:53:00 · 1508 阅读 · 1 评论 -
C语言计算字符串数组中每个字符串出现的个数
unsigned int str_num(char *str[], int num[], int len){ int i, j; int count; int flag[len]; for (i = 0; i < len; i++) { num[i] = 0; flag[i] = 0; } ...原创 2018-10-29 13:43:00 · 6812 阅读 · 0 评论 -
指针数组做函数形参
在设计函数过程中,想要函数参数传入一个指针数组,多为字符串数组,在函数形参的设计上有两种思路,具体以下列两种应用场景为说明一、字符串处理函数strsort从程序设计角度来看,将多个字符串传递给函数处理时,因为传递的是一维数组,形参的定义比较简单。例如,函数strsort()可对多个字符串进行排序,函数头的定义形式如下:void strsort(char *s[],int n) ...原创 2018-10-23 13:43:00 · 2597 阅读 · 0 评论 -
#error 、 #line 和 #pragma 的使用
1. #error 的用法(1)#error 是一种预编译器指示字,用于生成一个编译错误消息(2)用法:#error message //注意:message 不需要用双引号包围(3)#error 编译指示字用于自定义程序员特有的编译错误消息。类似的,#warning 用于生成编译警告消息(4)#error 可用于提示编译条件是否满足。编译过程中的任何错误意味着无法生成最终的可执行...转载 2018-10-16 19:05:00 · 774 阅读 · 0 评论 -
CRC校验原理及步骤
什么是CRC校验?CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 CRC校验原理:其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里...转载 2018-08-29 11:01:00 · 14259 阅读 · 0 评论 -
函数的局部变量返回值
一般的来说,函数是可以返回局部变量的,但是要注意几种情况。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指...转载 2018-08-30 11:58:00 · 1306 阅读 · 0 评论 -
CRC校验的C语言实现
文章转自 循环冗余校验(CRC)算法入门引导 - Ivan 的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/liyuanbhu/article/details/7882789 一、原理部分CRC 算法的基本思想是将传输的数据当做一个位数很长的数,将这个数除以另一个数,得到的余数作为校验数据附加到原数据后面。除法采用正常的多项式乘除法,而加减...转载 2018-09-03 19:55:00 · 8705 阅读 · 0 评论 -
C语言调试小技巧
经常看到有人介绍一些IDE或者像gdb这样的调试器的很高级的调试功能,也听人说过有些牛人做工程的时候就用printf来调试,不用特殊的调试器。特别是在代码经过编译器一些比较复杂的优化后,会变得“难以辨认”,使用调试器也变得有些头疼。先举个简单的例子: 1 #include <stdio.h> 2 3 int main(){ 4 int a[6], i, s...转载 2018-09-05 11:49:00 · 180 阅读 · 0 评论 -
malloc()和free()的原理及实现
在C语言中只能通过malloc()和其派生的函数进行动态的申请内存,而实现的根本是通过系统调用实现的(在linux下是通过sbrk()系统调用实现)。malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,...原创 2018-09-12 16:00:00 · 827 阅读 · 0 评论 -
结构体数组初始化
#include <stdio.h>struct stu{ int a; int b;};int main(){ struct stu stu1[2] = { { .a = 1, .b = 333, }, { .a =...原创 2018-09-25 19:40:00 · 3879 阅读 · 0 评论 -
main()函数的形参
main函数中的第一个参数argc代表的是向main函数传递的参数个数,第二个参数argv数组代表执行的程序名称和执行程序时输入的参数#include <stdio.h>int main(int argc, const char *argv[]){ int i; for(i = 0; i < argc; i++) { printf...原创 2018-09-29 16:21:00 · 2437 阅读 · 0 评论