c语言
文章平均质量分 55
a小菜a
这个作者很懒,什么都没留下…
展开
-
【指针】何为指针及优缺点
什么是指针?指针最为简短的定义:指针即为内存的地址。那什么是内存呢?举个栗子:当我们计算 4*(46+4)时,我们人脑会想到先有个中间值 50 然后再计算成 200,计算机也会这样有一个 50 的中间值,我们人脑在计算的时候 50 这个中间值保存在我们的万能的脑子中,计算机在出现最终答案前也会把这个中间值一个方便它进行下一步计算的地方,这地方就是内存。实际上我们写程序的时候定义的所有变量都保存在内存中, 可以想象一个大的程序所占用的内存是不容小觑的,在计算机刚被制造出来的时候那些大佬是如何节省原创 2021-08-24 22:10:41 · 2643 阅读 · 1 评论 -
【指针进阶08】回调函数
回调函数一个通过函数指针调用的函数回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的, 用于对该事件或条件进行响应。code1#include<stdio.h>void print(char* str){ prinft("hehe:%s", str);}void test(void(*p)(char*)){ printf("test\n"); p("bit");}int main(){ test(pr原创 2021-08-18 20:47:39 · 111 阅读 · 2 评论 -
【指针进阶07】指向函数指针数组的指针
回顾1.数组指针int arr [10] = { 0 };int ( * pa ) [10] = &arr;p是一个指向整型数组的指针。2.函数指针数组int ( * pf) ( int , int )int ( * pfArr [4] ) ( int , int );pfArr是一个数组 - 函数指针的数组指向函数指针数组的指针指向函数指针数组的指针是一个指针, 指针指向一个数组,数组的元素都是函数指针;int ( * ( * ppfArr ) [4]) ( int原创 2021-08-18 10:17:35 · 519 阅读 · 0 评论 -
【指针进阶06】函数指针数组
函数指针数组把函数的地址存到一个数组中,那这个数组就叫函数指针数组;int ( * parr1 [10] ) ( );parr1先和 [ ] 结合,说明parr1是数组,数组的内容是什么呢?是 int(*)() 类型的函数指针。这个还是很好理解的。code1用函数指针数组存放函数int Add(int x, int y)//int(*)(int,int){ return x + y;}int Sub(int x, int y){ return x - y;}i原创 2021-08-18 09:48:06 · 2040 阅读 · 0 评论 -
【指针进阶05】函数指针
函数指针是指向函数的指针 - 存放函数地址的一个指针int ( * ) ( int , int )看代码code1#include<stdio.h>int Add(int x,int y){ return x + y;}int main(){ int a = 10; int b = 20; int(*pf)(int, int) = &Add; printf("%d\n", pf(2, 3)); printf(原创 2021-08-17 10:28:42 · 113 阅读 · 0 评论 -
【指针进阶04】数组传参和指针传参
前言在写代码的时候难免要把【数组】或者【指针】传给函数,那函数的参数该如何设计呢?数组传参一维数组传参两种形式 - - - 传值和传址void test(int arr[]) {} void test(int arr[10]) {} void test(int* arr) {} void test2(int* arr[20]) {}原创 2021-08-16 21:49:48 · 274 阅读 · 0 评论 -
【指针进阶03】指针数组
前言本章东西不多,非常容易,主要以举例,练习为主。指针数组- - 是数组,用来存放指针的int arr[10] = { 0 };//整型数组char ch[5] = { 0 }; //字符数组int* parr[4]; //存放整型指针的数组 -- 指针数组char* pch[5]; //存放字符指针的数组 -- 指针数组code1#include<stdio.h>int main(){ int a = 10; int b = 20;原创 2021-08-15 20:21:59 · 77 阅读 · 0 评论 -
【指针进阶02】数组指针
前言回顾上一章字符指针可以发现不同指针间的区别int *p=NULL; p 是整型指针 - 指向整型的指针 - 可以存放整型的地址char *pc=NULL; pc是字符指针 - 指向字符的指针 - 可以存放字符的地址数组指针 – 指针数组指针 - 指向数组的指针 - 存放数组的地址数组指针的组成char* arr[5];char* (*pa)[5] = &arr;// char *:pa指向的数组的元素类型是char// pa : 指针变量的名字// *原创 2021-08-14 22:41:04 · 148 阅读 · 1 评论 -
【指针进阶01】字符指针
字符指针指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。即将字符串的首地址赋值给字符指针,可让字符指针指向一个字符串。话不多说,直接上代码test1int main(){ char ch = 'w'; char * pc = &ch; const char* p = "hello bit";//"hello bit"是一个常量字符串 printf("%s\n", p); printf("%c\原创 2021-08-13 22:10:08 · 126 阅读 · 0 评论 -
qsort排序各种类型的数据
qsort可以排序任意类型的数据qsort-库函数-排序void qsort(void base, size_t num, size_t width, int(cmp)(const void e1, const void e2) );int型int cmp_int(const void* e1, const void* e2){ return *(int*)e1 - *(int*)e2;}void test1(){ int a[] = { 1,2,3,0,9,8,7,5,4,6原创 2021-08-11 22:10:23 · 204 阅读 · 0 评论 -
判断字符串
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。例如:给定s1 = AABCD和s2 = BCDAA,返回1给定s1 = abcd和s2 = ACBD,返回0.AABCD左旋一个字符得到ABCDAAABCD左旋两个字符得到BCDAAAABCD右旋一个字符得到DAABC这里用到了库函数strcpy,strcat,strstrstrcpy: 将源字符串拷贝到目标空间;strcat: 追加字符串到目标空间字符串后面;strstr: 查找子串·;int findRo原创 2021-08-10 21:40:38 · 168 阅读 · 0 评论 -
字符串旋转k个字符
字符串左旋实现一个函数,可以左旋字符串中的k个字符例如:ABCD左旋一个字符得到BCDAABCD左旋两个字符得到CDAB设计循环使其可以旋1次,然后让他执行n次是一个最简单的思路:void LeftRotate(char* s, int k){ int i, j, tmp; int len = strlen(s); k %= len; for (i = 0; i < k; i++) //执行k次的单次平移 { tmp = s[0]; for (j = 0; j &l原创 2021-08-10 21:28:47 · 172 阅读 · 0 评论 -
手把手带你函数栈帧的创建和销毁(通过内存和图解)
前言本篇文章是在VS2013环境下调试的在研究函数栈帧的创建和销毁时,建议不要使用太高级的编译器,越高级的编译器,越不容易观察函数的栈帧创建和销毁的过程。 同时,函数栈帧创建和销毁的过程在不同编译器下是有略微差异的,但大体上是一致的,具体细节取决于编译器的实现。那么什么是函数栈帧呢?每一个函数调用,都会在栈上创建一个空间,而这个在栈区上为函数创建的空间就叫做函数栈帧。接下来就开始关于函数栈帧的创建和销毁的学习吧!寄存器首先,让我们先了解有哪些寄存器,有eax,ebx,ecx,edx……我原创 2021-08-08 20:01:52 · 503 阅读 · 2 评论 -
简单扫雷小游戏
前言扫雷想必大家都玩过,实现起来其实并不困难,上图设计代码展示扫雷game.h#pragma once#include<stdio.h>#include<stdlib.h>#include<time.h>#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define EASY_COUNT 10//初始化棋盘void InitBoard(char board原创 2021-07-31 10:38:17 · 128 阅读 · 0 评论 -
简单三子棋(结尾有惊喜>_<)
前言三子棋想来大家都不陌生,就不多说了,直接上图设计思维导图代码主函数三子棋test.c#define _CRT_SECURE_NO_WARNINGS#include"三子棋game.h"void menu(){ printf("*************************\n"); printf("**** 1.play 0.exit ****\n"); printf("*************************\n");}//游戏核心--算法实现原创 2021-07-28 21:15:40 · 95 阅读 · 2 评论 -
数据的存储
挺久没写博客了,最近在搞GitHub,把这个忘了,实在抱歉;本人开始深入学习C语言了,总结一波基础知识数据的存储一、整型1.int对于整型来说,数据存放内存中其实存放的是补码正数的原码、反码、补码都相同补码=反码+1另外,说下存储模式;有两种,分为大端(存储)模式和小端(存储)模式;大端(存储)模式:数据的低位保存在内存的高地址,而数据的高位保存在内存的低地址;小端(存储)模式:数据的低位保存在内存的低地址,而数据的高位保存在内存的高地址;这样说可能不够形象,现在原创 2021-05-15 07:51:03 · 659 阅读 · 5 评论 -
【指针进阶完结篇】指针和数组的笔试题解析(内存与图解)
sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。除此之外所有的数组名都表示首元素的地址。一维数组#include<stdio.h>#include<string.h>int main() { int a[] = {1,2,3,4};//4*4 = 16 printf("%d\n",sizeof(a)); //16 -sizeof(数组名)-计算的是数组...原创 2021-07-25 18:23:32 · 291 阅读 · 3 评论 -
递归的简单练习
递归打印一个整数每一位#include<stdio.h>void Print(int n){ if (n < 10) { printf("%d ", n); } else { Print(n / 10); printf("%d ", n % 10); }}int main(){ int n = 0; printf("input number:>"); scanf_s("%d", &n); Print(n); return原创 2021-07-24 20:58:04 · 272 阅读 · 2 评论