![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
文章平均质量分 55
各种实例代码以及注意事项
ONE_Day|
这个作者很懒,什么都没留下…
展开
-
GCC的gcc和g++区别
GCC的gcc和g++区别什么是gcc / g++?首先说明:gcc 和 GCC 是两个不同的东西**GCC:**GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。gcc是GCC中的GUN C Compiler(C 编译器)**g++**是GCC中的GUN C++ Compiler(C++编译器)一个有趣的事实就是,就本质而言,gcc和g++并不是编译器,也不是编译器的集合,它们只是一转载 2022-04-30 00:05:45 · 711 阅读 · 0 评论 -
ANSI C、C89、C99和C51的区别
ANSI C、C89、C99和C51的区别什么是ANSI C、ISO C、C89、C90标准?随着C语言使用得越来越广泛,出现了许多新问题,人们日益强烈地要求对C语言进行标准化。1983年,美国国家标准协会(ANSI)组成了一个委员会,X3J11,为了创立 C 的一套标准。经过漫长而艰苦的过程,该标准于1989年完成,这个版本的语言经常被称作ANSI C,或有时称为C89(为了区别C99)。在1990年,ANSI C标准(带有一些小改动)被美国国家标准协会(ANSI)采纳为ISO/IEC 9899:19转载 2022-04-29 23:59:42 · 4338 阅读 · 0 评论 -
C语言错误信息报告函数strerror、perror的使用
strerrorchar * strerror ( int errnum );返回错误码,所对应的错误信息。(是把错误码转化为对应的错误信息)#include <errno.h>//必须包含的头文件可通过往strerror的参数中放入不同的数,罗列出错误提示for (int i = 0; i < 10; i++){ printf("%s\n", strerror(i));}结果:使用库函数的时候调用库函数失败时,都会设置错误码,该错误码放在errno变量中,需要引原创 2022-04-29 23:55:27 · 1482 阅读 · 0 评论 -
C语言memcpy等内存操作函数使用介绍
memcpy内存拷贝void * memcpy ( void * destination,const void * source,size t num ) ;功能:函数从source中复制num个字节到destination中,并返回destination指针。 如果destination 和source 重叠,则函数行为不确定因为参数的类型都是void*,所以传任何类型的数据都可以,传多少由第三个参数字节数来决定void* my_memcpy(void* dest,const void* src原创 2022-04-28 23:53:07 · 1610 阅读 · 0 评论 -
C语言strlen函数求字符串长度及自己实现
strlensize_t strlen ( const char * str );1.字符串已经’\0’作为结束标志,strlen函数返回的是在字符串中’\0’前面出现的字符个数(不包含’\0’ )2.参数指向的字符串必须要以’\0’结束。3.注意函数的返回值为size_t,是无符号的(易错)4.学会strlen函数的模拟实现注意无符号的例子:int main (){ if (strlen ( "abc" ) - strlen ( "abcdef") >0) { printf原创 2022-04-28 22:32:42 · 2955 阅读 · 0 评论 -
C语言字符串操作函数strcpy、strcat、strcmp的使用介绍和函数实现
strcpychar* strcpy(char * destination,const char * source );1.源字符串必须以’\0’结束。2.会将源字符串中的’\0’拷贝到目标空间。3.目标空间必须足够大,以确保能存放源字符串。4.目标空间必须可变。5.学会模拟实现。char arr[10] = {0};char arr1[] = {'a','b','c'};strcpy(arr,arr1); //错误,arr1字符串没有明确给出'\0',拷贝不知何时停止char*原创 2022-04-28 00:07:55 · 1629 阅读 · 0 评论 -
C语言字符操作函数
字符分类函数函数如果他的参数符合下列条件就返回真iscntrl任何控制字符isspace空白字符:空格’‘,换页\f’,换行’\n’,回车1\r’,制表符’\t’或者垂直制表符’\v’isdigit十进制数字0~9isxdigit十六进制数字,包括所有十进制数字,小写字母a ~ f,大写字母A ~ Fislower小写字母a~zisupper大写字母A~Zisalpha字母a ~ z或A ~ Zisalnum字母或者数字,a ~原创 2022-04-26 21:40:25 · 83 阅读 · 0 评论 -
C语言字符串函数strstr和strtok使用介绍
strstrchar * strstr ( const char * ,const char * ) ;在一个字符串中找另外一个字符串,找到了返回符合的子串的首地址,找不到就返回NULLstrstr函数实现char* my_strstr(const char* str1, const char* str2){ const char* p1 = NULL; const char* p2 = NULL; const char* temp = str1; /*再加多一个指针保存str1开始比较的字原创 2022-04-26 21:36:08 · 610 阅读 · 0 评论 -
C语言实现字符串按单词翻转
实现字符串按单词翻转两步翻转法 1.字符串整体翻转 2.每个单词翻转比如要将I am student.按单词翻转,变为student. am I#include <stdio.h>#include <string.h>void reverse_string1(char* left,char* right){ char temp; while (left < right) { temp = *left; *left = *right; *righ原创 2022-04-25 21:36:57 · 1715 阅读 · 0 评论 -
C语言字符串、转义字符、操作符
字符串、转义字符、操作符几个注意事项1.字符串字符串的结束标志:\0求字符串的长度:使用strlen函数在arr2数组中再加个’\0’字符,就能正确打印出abcchar arr1[] = "abc"; //内存存放形式:abc\0char arr2[] = {'a','b','c'}; //内存存放形式:abc?????????//打印字符串printf("%s\n",arr1); //abcprintf("%s\n",arr2); //abc烫烫烫烫烫烫b//求字符串长度原创 2022-04-24 21:11:45 · 760 阅读 · 0 评论 -
C语言指针练习
指针练习int a [ 5] = { 1,2,3,4,5 };int* ptr = (int* ) ( &a + 1) ;printf ( "%d,%d",* (a + 1), * (ptr - 1) ); //2,5解释:&a取出一整个数组的地址,+1后跳到数组最后一个元素的后一个地址,类型是int(*)[5],是数组指针的类型,需要强制类型转换为int,才能赋给指针ptr,ptr-1到下标为4的元素,解引用得到元素5,a是首元素地址,+1得到第二个元素地址,解引用得原创 2022-04-23 21:19:29 · 979 阅读 · 0 评论 -
C语言指针运算
指针运算1.指针+、-整数(*p++)int values[5];int *vp;for(vp = &values[5] ; vp>&vaiues[0]){ * --vp = 0;}指针vp初始化为数组最后一个元素的后一个位置,从后往前把数组内元素置成02.指针-指针 (指针-指针得到的两个指针之间的元素个数,可用于求字符串的长度)指针和指针相减的前提:两个指针指向同一块空间3.指针的关系运算 (p<&arr[5])for(vp = &原创 2022-04-23 21:07:19 · 1230 阅读 · 0 评论 -
C语言字符指针
字符指针char* ps = "hello bit" ;//本质上是把"hello bit"这个字符串的首字符的地址存储在了ps中,跟字符数组不一样printf ("%c\n", *ps) ; //结果是字符h用字符指针指向的字符串是常量字符串,是不能改的,如*ps = 'w’是不可以的char arr[] = "hello bit" ; //是真的把该字符串存到一个数组中//只不过两者的访问形式都一样,都可打印“hello bit”printf("%s\n", ps);printf (原创 2022-04-23 21:04:52 · 456 阅读 · 0 评论 -
C语言指针和数组
指针和数组数组名是数组首元素的地址int arr[10] = {1,2,3,4,5,6,7,8,9,10}int *P = arr;printf("%d\n",arr[2]); //3 在编译器内处理时会变成*(arr+2)printf("%d\n",p[2]); //3 可转为 *(p+2)printf("%d\n",2[arr]); //3[ ] 是一个操作符,2和arr是两个操作数,既然加法有交换律,同理,2和arr交换也是可以的arr[2] < == > * (a原创 2022-04-23 15:20:59 · 566 阅读 · 0 评论 -
C语言二级指针
二级指针int a = 10;int *pa = &a;int **ppa=&pa;a的地址存放在pa中 , pa的地址存放在ppa中。pa是―级指针,而ppa是二级指针。对于二级指针的运算有:通过对ppa中的地址进行解引用* ppa,这样找到的是pa,* ppa其实访问的就是pa.int b = 20;*ppa = &b; //等价于pa = &b;**ppa先通过 * ppa找到pa ,然后对pa进行解引用操作:*pa,那找到的是a.**ppa原创 2022-04-23 15:18:32 · 282 阅读 · 0 评论 -
C语言函数指针:指向函数的指针
函数指针:指向函数的指针!存放函数地址的指针&函数名-取到的就是函数的地址数组名(数组首元素的地址) != &数组名(一整个数组的地址)函数名 == &函数名 -> 两者等价int Add(int x,int y){ return x+y;}int(*pf) (int, int) = &Add; //pf就是一个函数指针变量int(*pf)(int, int) = Add; //也可以这样定义,可得&Add == Addin原创 2022-04-21 22:18:47 · 1049 阅读 · 0 评论 -
C语言回调函数介绍及用qsort函数排序数组和结构体
回调函数回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。例如:int A(int x,int y){……};int B(int x,int y){……};int C(int(*pf)(int ,int)) -> C函数的参数是一个函数指针,当把A函数或者B函数的地址当作参数原创 2022-04-21 22:06:38 · 687 阅读 · 0 评论 -
C语言野指针,程序中隐藏的“陷阱”
野指针概念︰野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)需要注意的是,野指针不是NULL指针,通常NULL指针可以使用if语句来判断,但是C语言中没有任何方法用来判断一个指针是否为野指针!野指针成因1.指针未初始化int* p; //p是一个局部的指针变量,局部变量不初始化的话,默认是随机值*p = 20; //非法访问内存了2.指针越界访问int arr[10] = {0};int *p = arr;int i = 0;for(i=0; i<=10原创 2022-04-21 21:58:12 · 222 阅读 · 0 评论 -
C语言指针类型及意义
内存存放1.内存是怎么编号的?32位 32跟地址线 物理线 通电 1/064位电信号转换成数字信息:1和0组成的二进制序列2.一个这样的内存单元是多大空间?最终:一个内存单元是一个字节,然后分配地址的指针类型C语言编译器对指针这个特殊的概念,有2个疑问?1、分配一个盒子,盒子要多大? 在32bit系统中,指针就是4个字节,因为内存地址的范围是 0~232 ,即全0到全1,如果想要一个指针能随便指向这么多内存地址,就要占32个位,所以是4个字节同理:在64位系统中,cpu会原创 2022-04-19 14:57:07 · 453 阅读 · 0 评论 -
#pragma once和#ifndef的作用和区别
两者共同的作用:防止库文件重复包含(#ifndef / #define / #endif)方法一:在.h头文件开头加上#pragma once//add.h#pragma onceint ADD(x,y);方法二:在.h头文件加上预定义指令//add.h#ifndef _ADD_H_/*第一次包含该头文件时,没有定义_ADD_H_,该预处理为真,则下面便定义_ADD_H_符号;如果想第二次包含该头文件时, 此时_ADD_H_已经定义,判断为假,则下面的语句都不进行预处理,即不再引入*原创 2022-04-16 22:48:18 · 698 阅读 · 0 评论 -
程序的翻译环境和执行环境
程序的翻译环境和执行环境在ANSI C的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行代码。翻译阶段:预处理选项:gcc - E test.c -o test.i预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。编译选项gcc -s test.c编译完成之后就停下来,结果保存在test.s中。汇编gcc -c test.c汇编完成之后就停下来,结果保存在test.o中。test.原创 2022-04-16 22:42:56 · 193 阅读 · 0 评论 -
C语言#define宏定义及其相关注意事项详解
预处理详解预定义符号(两边分别是两个下划线)__FILE__ //进行编译的源文`在这里插入代码片`件__LINE__ //文件当前的行号__DATA__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义__FUNCTION__ //当前函数名VS编译器不支持ANSI C,所以没有STDC预定义符号,在Linux的gcc编译器中则有日志的一种简单写法int main(){ FILE* pf =原创 2022-04-14 14:43:39 · 4387 阅读 · 0 评论 -
C语言#include<>和#include“ “的区别
文件包含我们已经知道,#include 指令可以使另外一个文件被编译。就像它实际出现于#include指令的地方一样。这种替换的方式很简单:预处理器先删除这条指令,并用包含文件的内容替换。这样一个源文件被包含10次,那就实际被编译10次。头文件被包含的方式:本地文件包含#include "filename"查找策略:先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件。如果找不到就提示编译错误。Linux环境的标准头文件的路径:/usr/i原创 2022-04-11 17:43:05 · 2530 阅读 · 0 评论 -
C语言整型提升
整型提升含义:C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符(char)和短整型(short)操作数在使用之前被转换为普通整型,这种转换称为整型提升。整型提升的意义︰表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。通用CPU ( general-purpo原创 2022-04-09 19:53:50 · 561 阅读 · 0 评论 -
文件读取结束的判定
文件读取结束的判定被错误使用的feof牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。feof函数是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。(即feof函数不是用来判定是否读取结束的,是已经读取结束后用来判断什么原因结束的)1.文本文件读取是否结束,判断返回值是否为EOF( fgetd),或者NULL ( fgets)例如:fgetc判断是否为EOFfgets判断返回值是否为NULL2.二进制文件的读取结束判断,判断返回值是否小于实原创 2022-04-09 19:31:23 · 3109 阅读 · 1 评论 -
C语言文件随机读写
文件随机读写fseek:int fseek ( FILE * stream, long int offset, int origin );根据文件指针的位置和偏移量来定位文件指针.(重新定位流位置指示器)stream:指向标识流的文件对象的指针offset:二进制文件:从原点偏移的字节数。 文本文件:零或ftell返回的值。(向前偏移则是负数,向后偏移是正数)origin:用作偏移量参考的位置。它由< cstdio >中定义的下列常量之一指定,专门用作此函数的参数:SEEK原创 2022-04-08 09:01:22 · 810 阅读 · 0 评论 -
C语言文件读写常用函数
文件的顺序读写在读写之前,仍然要先用fopen打开文件功能函数名适用于字符输入函数fgetc所有输入流字符输出函数fputc所有输出流文本行输入函数fgets所有输入流文本行输出函数fputs所有输出流格式化输入函数fscanf所有输入流格式化输出函数fprintf所有输出流二进制输入fread文件二进制输出fwrite文件fputc:函数原型:int fputc ( int character原创 2022-04-05 22:22:58 · 4911 阅读 · 0 评论 -
C语言文件操作
什么是文件磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe) 。数据文件文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器。文件名一个文件要有一个唯一的文原创 2022-04-04 23:10:10 · 742 阅读 · 0 评论 -
C语言格式化输入输出函数的比较(printf、fprintf、sprintf、scanf、fscanf、sscanf)
printf、fprintf、sprintf的区别printf:int printf ( const char * format, … );针对标准输出的格式化输出语句(将格式化数据打印到标准输出) - stdout(一般是显示器)fprintf:int fprintf ( FILE * stream, const char * format, … );针对所有输出流的格式化输出语句(将格式化数据写入流)- stdout、文件sprintf:int sprintf ( char *原创 2022-04-03 23:13:29 · 1059 阅读 · 0 评论 -
C语言位段
位段的定义什么是位段位段的声明和结构体是类似的,有两个不同.1.位段的成员必须是int,unsigned int或signed int。(其实也见过char类型的,char也归属整型)2.位段的成员名后边有一个冒号和一个数字。struct A{ int a : 2; //_a成员占2个bit位 int b : 5; //_b成员占5个bit位 int c : 10; //_c成员占10个bit位 int d : 30; //_b成员占30个bit位};原创 2022-04-02 21:46:48 · 312 阅读 · 0 评论 -
C语言枚举类型
枚举类型声明enum Color{ //里面定义的常量是以1递增的,rRED = 3在这里是初始化,可行,不是更改 RED, //0 GREEN, //1 BLUE //2};int main(){ enum Color c = 2; //在.c文件下编译器没报错,但在.cpp文件下就不行,说明这是种不好的写法,还是写回下面这种写法 enum Color = BLUE; RED = 3; //语法错误,RED是常量,不能更改}原创 2022-04-02 21:44:37 · 623 阅读 · 0 评论 -
C语言联合体大小计算及判断大小端
联合体(共用体)联合类型的定义联合也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。联合大小的计算联合的大小至少是最大成员的大小。但不一定是,会有内存对齐当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。即联合体也是有内存对齐的union S{ short a[5]; //对齐数是原创 2022-04-01 16:54:21 · 1179 阅读 · 0 评论 -
C语言if,while,switch注意事项
if语句判断两值是否相等int main(){ int num = 5; if(num == 5) { printf("%d",num); } if(5 == num) //推荐这种写法 { printf("%d",num); } return 0;}当判断两个值是否相等,把常量放在左边,如果此时大意把 == 写成了 = ,编译器会直接报错,常量不能放左边,也就避免了写错如果是num== 5,当大意把 == 写成 = ,编译器不会报错,但代码的逻辑已出现错误,不原创 2022-04-01 16:48:22 · 826 阅读 · 0 评论 -
C语言变长数组、字符串结束符、数组在内存中的存放、数组名及类型
C语言数组要注意的一些知识点变长数组C99 标准中引用一个概念:变长数组支持数组创建的时候,用变量指定大小的,但是这个数组不能初始化gcc :支持C99,可以用变量定义数组大小VS2019不支持C99中变长数组的字符串结束符#include <stdio.h>int main(){ char str1[] = "abc"; //内存存放:abc\0 char str2[] = {'a','b','c'}; //内存存放:abc printf("%s\n",str1原创 2022-03-31 11:52:16 · 372 阅读 · 0 评论 -
C语言柔性数组介绍
柔性数组也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。//写法1typedef struct st_type{ int i; int a[0];//柔性数组成员,大小未知}type_a;//写法2typedef struct st_type{ int i; int a[];//柔性数组成员,大小未知}type_a;柔性数组的特点:结构中的柔性数组成员原创 2022-03-29 22:17:21 · 1050 阅读 · 0 评论 -
C语言冒泡排序算法
冒泡排序冒泡排序是交换排序中最简单的排序方法,其基本思想是:两两比较相邻记录,如果反序则交换,直到没有反序的记录为止void buble_sort(int arr[],int len){ for (int k = 0; k < len - 1; k++) //趟数,因为数组元素是10个,所以比较9趟 { for (int i = 0; i < (len - 1)-k; i++) //每趟过后交换的次数少一次 { if (arr[i] > arr[i+1]) {原创 2022-03-28 23:32:37 · 1154 阅读 · 0 评论 -
浮点数例子
9的二进制是:00000000 00000000 00000000 00001001因为pFloat是浮点型指针,直接把n中的二进制看成了浮点型0 00000000 00000000000000000001001S E M此时E是全0的,所以次方数是2 ^ -126,小数点前补0,结果是:0.00000000000000000001001*2 ^ -126因为%f打印小数点后6位,所以结果是0.0000009.0的二进制是:1001.0 -> 1.001*2^3.原创 2022-03-27 13:35:12 · 194 阅读 · 0 评论 -
浮点型存储
浮点型存储常见的浮点数︰3.14159 、1E10浮点数家族包括:float、double、long double类型。浮点数表示的范围 : float.h中定义浮点数和整数在内存中存储的方式一定是有区别的!根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数v可以表示成下面的形式:(-1)^S * M * 2^E(-1)^S表示符号位(-1的几次方),当S=0,V为正数;当S=1,V为负数。M表示有效数字(二进制),大于等于1,小于2。2^E表示指数位。十进制的-原创 2022-03-27 13:34:10 · 56 阅读 · 0 评论 -
C语言数据存储大小端
什么是大端小端:大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存原创 2022-03-27 13:26:06 · 136 阅读 · 0 评论 -
C语言结构体内存对齐
结构体内存对齐如何计算结构体的大小?首先得掌握结构体的对齐规则:1.第一个成员在与结构体变量偏移量为0的地址处。(将第一个成员放在结构体内存的第0处)2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。(从0地址处开始,偏移量逐渐增减,每个字节加一,第二个成员开始,将成员的字节大小跟对齐数(VS2019编译器的默认对齐数是 8)进行比较,选两者中较小的,把该变量放到小的对齐数的偏移量地址上)对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。VS中默认的对齐数为8Linux -原创 2022-03-26 14:06:53 · 1146 阅读 · 0 评论