C笔记
EthanBill
这个作者很懒,什么都没留下…
展开
-
什么是自定义类型?
像int, double, int* 这种,是C语言本身就有的类型。结构液体类型struct Student是结构体的类型,stu 就是用这个类型定义的一个结构体变量。就像用 int 类型定义一个 num 变量一样。struct Student { int id; char name[10];};int main() { struct Student stu; return 0;}这个类型名字太长了,不方便使用啊~别着急,使用typedef重命名类型。typedef struct原创 2021-07-31 11:13:14 · 399 阅读 · 0 评论 -
模拟实现内存函数
memcpy拷贝一块连续的内存空间(num个字节)void* my_memcpy(void* dest, const char* src, size_t num) { assert(dest != NULL); assert(src != NULL); assert(num != 0); char* cdest = (char*)dest; const char* csrc = (const char*)src; for (size_t i = 0; i < num; i++) {原创 2021-07-29 18:12:38 · 104 阅读 · 0 评论 -
模拟实现字符串函数
strlen返回字符串长度,不包含 ‘\0’size_t my_strlen(const char* str) { // 校验参数的合法性 //if (str == NULL) { // // 操作 //} // 还有一种方法是 assert"断言" assert(str != NULL);// 条件成立,无事发生,否则程序崩溃 size_t size = 0; while (str[size] != '\0') { size++; } return size;}s原创 2021-07-29 15:48:12 · 130 阅读 · 0 评论 -
C语言·函数指针
指针内存:一个大走廊,里面有很多房间,每个房间有一个字节那么大,房间的门牌号就是内存的地址。创建一个变量来保存这个地址,这个变量就叫指针变量。C语言的char*,有时候指向一个字符,有时候指向一个字符数组,还有的时候指向一个字符串“”。和指针相关的两个最基本的操作:解引用和取地址解引用需要找到对应内存的其实地址,然后获取内存的长度,才能解引用指针的类型,体现了解引用内存的长度指针变量本身的长度是固定的必须是有效(指针中的地址,对应的内存必须是你申请到的)的指针才能解引用,如果i是无效的指针(原创 2021-07-28 16:54:36 · 122 阅读 · 0 评论 -
C语言·斐波那契数列
斐波那契数列斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 196原创 2021-07-22 18:54:48 · 484 阅读 · 0 评论 -
C语言·二分查找
二分查找二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。依照上述逻辑,我们可以原创 2021-07-22 08:56:00 · 107 阅读 · 0 评论 -
C语言·判断闰年
什么是闰年?世纪闰年世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。普通闰年普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。依照上述闰年的概念,我们可以写出这样的代码:#include<stdio.h>int IsLeapYear(int year) { // 世纪闰年 if (year % 100 == 0) { if (year % 400原创 2021-07-22 08:18:22 · 596 阅读 · 0 评论 -
C语言·转义字符
转义字符释义ASCII(十进制)\0空字符000\a响铃(BEL)007\b退格(BS) ,将当前位置移到前一列008\t水平制表(HT) (跳到下一个TAB位置)009\n换行(LF) ,将当前位置移到下一行开头010\v垂直制表(VT)011\f换页(FF),将当前位置移到下页开头012\r回车(CR) ,将当前位置移到本行开头013\"代表一个双引号字符034\’代表一个单引号(撇号)字...原创 2021-07-18 14:20:46 · 588 阅读 · 0 评论 -
深度剖析数据在内存中的存储
文章目录定点数的表示定点小数定点整数整数的机器码表示原码反码补码浮点数的表示浮点数的规格化P.S. 移码浮点数的机器表示整型数据在内存中的存储字节序自测计算机中常用的数据表示格式有定点格式和浮点格式两种。一般来说,定点格式容许的数据范围有限,要求的处理硬件比较简单;浮点格式容许的数值范围很大,要求的处理硬件比较复杂。定点数的表示定点数,即小数点位置固定不变。原理上,小数点的位置固定在哪一位都是可以的,但我们通常将数据表示成 纯小数 或 纯整数。假设用 n+1 位字来表示一个定点数 x,由于原创 2021-05-25 17:24:35 · 272 阅读 · 0 评论 -
C语言操作符
文章目录算术操作符移位操作符左移操作符右移操作符算术右移逻辑右移位操作符逻辑操作符赋值操作符单目操作符关系操作符条件操作符算术操作符+ - * / %%操作符,要求左右操作数必须为整数移位操作符<< >>对于移位运算符,不能移动负数位,这个是C语言标准未定义的,属于 未定义行为。左移操作符int num = 10;num << 1;左移 1 位,就是把 num 在内存里的二进制全部向左移动 1 位,最左边的一个二进制位就被抛弃了,最右边补 0。原创 2021-05-09 16:32:50 · 104 阅读 · 0 评论 -
冒泡排序
文章目录升序排序降序排序核心思路:比较两个相邻元素的大小,然后按照排序要求交换位置升序排序从前往后遍历,每次取到一个最大的元素放到数组最后从后往前遍历,每次取出一个最小的元素放到数组最前面#include<stdio.h>void bubbleSort(int arr[], int size) { // 从后往前遍历 // bound=>边界,表示已排序区间和待排序区间的分界线 // [0,bount) 已排序区间 // [bound,size) 待排序区间 int原创 2021-05-04 11:54:01 · 829 阅读 · 1 评论 -
C语言二维数组
数组:批量创建一组类型相同的变量 int arr[5]={0,1,2,3,4}; 创建数组 [ ] 中必须给一个 常量 才可以。下标从0开始计算,通过[]取下标 计算数组中元素个数 sizeof(arr)/sizeof(arr[0])一维数组在内存中的存储是连续的二维数组本质上还是一个一维数组,只不过数组里面的每个元素又是一个一维数组。int arr[3][4] ==> 本质上是一个元素个数为 3 的一维数组,每个元素又是一个长度为 4 的一维数组。同一维数组一样 元素个数 3 可以省.原创 2021-05-04 10:13:38 · 894 阅读 · 0 评论 -
C语言字符串和字符数组
"hello,world\n"这种由双引号引起来的一串字符称为 字符串字面值,或者简称 字符串。注意: 字符串的结束标志是一个 \0 的转义字符。#include<stdio.h>int main(){ char arr1[] = "abc"; char arr2[] = {'a','b','c'}; return 0;}在vs的调试器上,可以看到在 arr1 这个数组中,其实存了4个字符~C语言没有字符串类型,只能使用字符数组来表示字符串,而这个字符数组中,会多保存一个原创 2021-05-02 10:23:17 · 202 阅读 · 0 评论 -
C语言变量、常量和基本数据类型
文章目录标识符变量常量数据类型标识符变量名、常量名、函数名、数组名等等,都是为了区分程序中不同的实体、人为起定的名字。通常把这些名字叫做标识符。标识符的命名规则如下:标识符可由三类字符:字母、下划线、数字组成;标识符只能由字母或下划线开头;标识符不能和关键字同名;标识符最好做到见名知意,不能具有二义性。变量全局变量局部变量作用域1当前整个工程当前代码块生命周期2跟随整个程序当前代码块初始值如果创建变量不初始化,系统会自动初始化为 0如果创建变量不初始化,原创 2021-05-01 12:11:58 · 131 阅读 · 0 评论