C
文章平均质量分 54
「已注销」
和我一起记录学习的点点滴滴 ◖⚆ᴥ⚆◗
展开
-
bug纠错--数组越界访问
#include<stdio.h>int main(){ int i=0; int a[3]={0}; for(;i<=3;i++){ a[i]=0; printf("hello world\n"); } return 0;}错因对 数组 a 进行了越界访问,而访问的地址正是 变量 i 在内存中的地址,在第四次循环时又将 变量i 的值置为 0 ,因此程序会陷入无限循环...原创 2021-11-16 21:25:44 · 231 阅读 · 0 评论 -
a[2]与2[a]的区别
假设声明了一个数组int a[8];以下两种访问是等效的,即2[a]a[2]原因这和编译器访问数组时的计算方式有关,假设访问 a[2] ,编译器的计算方式如下:*(a+2)而在访问 2[a] 时,计算方式如下:*(2+(a))化简后相当于*(2+a)总结a[2] 与 2[a] 之所以相同,是因为C实现下标的方法。虽然对编译器来说,这两种方式并无差别。但是我们应该避免2[a]这种写法,因为它会大大影响程序的可读性...原创 2021-09-26 19:04:41 · 611 阅读 · 0 评论 -
C语言可变参数--借助stdarg.h
C语言可变参数–借助stdarg.h简介stdarg.h 头文件定义了一个变量类型 va_list 和三个宏,这三个宏可用于在参数个数未知(即参数个数可变)时获取函数中的参数。可变参数的函数通在参数列表的末尾是使用省略号(,…)定义的。使用模板 int val=0; int i=0; va_list ap; /*定义一个va_list*/ va_start(ap, num_args);/*开始,num_args为要计算的参数的个数*/ for(i = 0; i原创 2021-09-25 15:35:04 · 90 阅读 · 0 评论 -
qsort()--快速排序函数
函数详情函数原型void qsort( void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *) );头文件:<stdlib.h>函数功能 qsort()函数的功能是对数组进行排序,数组有nmemb个元素,每个元素大小为size。各参数含义参数base : base指向数组的起始地址,通常该位置传入的是一个数组名参数n原创 2021-09-18 19:52:03 · 85 阅读 · 0 评论 -
unsign int 与 int
就如同int a;一样,int 也能被其它的修饰符修饰。除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:signed----有符号,可修饰char、int。int是默认有符号的。unsigned-----无符号,修饰int 、char,short等long------长型,修饰int 、double等short------短型,修饰int我们主要来看一下signed和unsigned与int之间的联系与区别。什么叫做有符号,什么叫做无符号这个问题其实很简单,原创 2021-09-18 19:07:01 · 662 阅读 · 0 评论 -
C语言sizeof与strlen详解
https://blog.csdn.net/chuxinchangcun/article/details/120219122?spm=1001.2014.3001.5501注意strlen() 与 sizeof 的返回类型均为 size_tsizeof()返回类型造成的坑int i ; //全局变量未初始化系统默认为0int main(){ i--; //i变成-1 if(i > sizeof(i)) { printf(">\n"); .原创 2021-09-18 18:45:14 · 88 阅读 · 0 评论 -
C 预处理
C 预处理–菜鸟教程笔记C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器(C Preprocessor)简写为 CPP。所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。下面列出了所有重要的预处理器指令:指令描述#define定义宏#include包含一个源代码文件#原创 2021-08-25 14:40:00 · 262 阅读 · 0 评论 -
memset()--初始化一段数据
函数原型void *memset(void *s, int c, unsigned long n);函数功能将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是 void* 型的指针变量,所以它可以为任何类型的数据进行初始化。memset() 的作用是在一段内存块中填充某个给定的值。因为它只能填充一个值,所以该函数的初始化为原始初始化,无法将变量初始化为程序中需要的数据。用memset初始化完后,后面程序中再向该内存空间中存放需要的数据。原创 2021-08-25 09:51:07 · 175 阅读 · 0 评论 -
定义和声明
词义定义:(definition)需要建立存储空间。声明:(declaration)不需要建立存储空间。我们声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用就没有单独声明的必要,变量是如此,函数也是如此,所以声明不会分配存储空间,只有定义时才会分配存储空间。语义定义:所谓定义就是(编译器)创建一个对象,为这个对象分配一块内存,并给它取上一个名字,这个名字就是就是我们经常所说的变量名或对象名。(对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据;对于函数,编译器会原创 2021-08-25 09:07:39 · 145 阅读 · 0 评论 -
结构体--内存对齐
内存对齐我们知道,整型变量有自己的大小,浮点型变量有自己的大小,数组也有自己的大小,那么结构体有没有自己的大小呢?回答是肯定的,结构体也有自己的大小,但是结构体的大小并不是简单地将每个结构体成员的大小相加就能得到。由此引发了一个问题–内存对齐。内存对齐的原因我们都知道计算机是以字节(Byte)为单位划分的,理论上来说CPU是可以访问任一编号的字节数据的,我们又知道CPU的寻址其实是通过地址总线来访问内存的,CPU又分为32位和64位,在32位的CPU一次可以处理4个字节(Byte)的数据,那么CP原创 2021-08-23 09:52:05 · 179 阅读 · 0 评论 -
getch()、getche()、kbhit()的使用
getch()、getche()、kbhit()的使用函数作用是否为标准库函数头文件getch()键盘上读入一个字符,不将读入的字符回显在显示屏幕上否conoi.hgetche()键盘上读入一个字符,并将读入的字符回显到显示屏幕上。否conio.hgetchar()键盘上读入一个字符,需等待输入直到按回车是string.hkbhit()非阻断函数,运行时不会暂停程序,作用是若有键盘输入,则返回输入的值(应该是键值转换),若没有则返回0。否c原创 2021-08-22 18:06:31 · 2126 阅读 · 0 评论 -
C语言总结–概述
C语言总结–概述C语言程序组成#include<stdio.h> //预处理指令int main(){ //主函数,程序从这里开始执行 printf("Hello World!"); //print()函数,输出文本信息 return 0; //向调用者返回一个值}注意:C程序就是执行主函数里的代码,也可以说这个主函数就是C语言中的唯一入口,而main前面的int就是主函数的类型一个程序有且只有一个主函数printf()是格式输出函数,原创 2021-08-19 15:09:41 · 210 阅读 · 0 评论