c语言
Electronic_rest
IT爱好者
展开
-
结构体传参方法
#include<stdio.h>#include<stdlib.h>typedef struct test//定义一个结构体{ int arr[100]; int a;}test;void print1(test s)//定义一个函数,将结构体变量作为参数传入函数{ for (int i = 0; i < 7; ++i) { printf("...原创 2020-02-26 18:16:28 · 4397 阅读 · 1 评论 -
结构体对齐规则及示例
为什么要进行内存对齐(以空间换时间)为了有助于加快计算机的取数速度,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基数据类型(int等)都位于能被4整除的地址上,能整除的话一次就读完了,会节省很多时间,这样两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。结构体对齐...原创 2020-02-26 14:48:46 · 238 阅读 · 0 评论 -
结构体的写法及赋值
结构体的写法–>推荐写法一1 typedef struct Student // typedef struct Student S{ char name[100]; int age; char tel[20];}S; // S是结构体类型 //结构体类型就是以struct关键字定义的数据类型2 struct Student{ char name[100...原创 2020-02-26 13:59:04 · 1266 阅读 · 0 评论 -
模拟实现memmove
模拟实现memove–>解决内存重叠问题#include<stdio.h>#include<stdlib.h>#include<assert.h>void* my_memove(void* str, const void* dst, size_t num){ assert(str&&dst);//限制不能为空指针 int* s...原创 2020-02-25 19:46:17 · 151 阅读 · 0 评论 -
模拟实现memcpy
模拟实现my_memcpy函数#include<stdio.h>#include<stdlib.h>#include<assert.h>//assert函数的头文件void* my_memcpy(void* str, const void* dst, size_t num){ //void* str 传入要被赋值的数组的地址 //void* dst ...原创 2020-02-06 13:34:19 · 151 阅读 · 0 评论 -
模拟实现strstr函数
strstr函数功能是判断字符串str2是否是字符串str1的字串#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>#include<string.h>char* my_strstr(char* str1, char* str2){...原创 2019-11-30 00:21:05 · 147 阅读 · 0 评论 -
模拟实现strcmp函数
strcmp函数 比较两个字符串的大小#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>#include<string.h>int my_strcmp(const char* str1, const char* str2){ whi...原创 2019-11-28 23:27:32 · 227 阅读 · 0 评论 -
模拟实现strcat函数
strcat函数 实现字符串的追加#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>char* my_strcat(char* s, char* g)//实现字符串得追加{ assert(s&&g);//防止输入为空指针 whi...原创 2019-11-28 00:05:16 · 351 阅读 · 0 评论 -
模拟实现strcpy函数
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>char* my_strcpy(char* o, char* n)//定义两个指针数组{ assert(o&&n);//判断传进来的是否是空指针 while (*o != '\0'...原创 2019-11-27 23:16:05 · 139 阅读 · 0 评论 -
模拟实现strlen函数
字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。参数指向的字符串必须要以 ‘\0’ 结束。注意函数的返回值为size_t,是无符号的( 易错 )#include<stdio.h>#include<stdlib.h>#include<string.h>int my_strlen...原创 2019-11-27 21:41:51 · 234 阅读 · 0 评论 -
逗号表达式
逗号表达式,只会取后面的值#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){ int a[3][2] = { (0, 1), (2, 3), (4, 5) }; //虽然是二维数组,但只初始化了一组值,等于int a[3][2]={1,2,3} int *p; p =...原创 2019-11-09 23:34:12 · 197 阅读 · 0 评论 -
指针和数组笔试题解析
一维数组#include<stdio.h>#include<stdlib.h>int main(){ int a[] = { 1, 2, 3, 4 }; printf("%d\n", sizeof(a)); //16 //对数组名求所占内存大小,就是求整个数组在内存中所占空间的大小 printf("%d\n", sizeof(a+0)); //4 /...原创 2019-11-09 20:43:29 · 278 阅读 · 0 评论 -
选择排序算法
#include<stdio.h>#include<stdlib.h>int FindMax(int arr[], int n)//将数组中最大值的下标返回{ int Max = arr[0];//假定最大值是arr[0] int pos = 0;//定义要返回的下标 for (int i = 0; i < n; i++)//遍历数组中的数 { if...原创 2019-11-07 00:04:36 · 130 阅读 · 0 评论 -
函数指针数组的应用实例
函数指针数组: 实际上是将多个函数的地址放到一个数组中,需要哪个函数用数组调用就行函数名就可以代表函数地址即: fun=&fun实现一个计算器#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>int Add(int x, int y){ return x + y;}...原创 2019-11-05 23:54:42 · 263 阅读 · 0 评论 -
利用typedef定义函数指针
利用typedef定义函数指针进入正文: 代码简化, 促进跨平台开发的目的. typedef 行为有点像 #define 宏,用其实际类型替代同义字。 不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。用法一:typedef int (*MYFUN)(int, int); 这种用法一般用在给函数定义别名的时候上面的例子定义MYFUN...转载 2019-11-05 18:10:02 · 891 阅读 · 0 评论 -
数组名和数组名地址意义的不同
数组名的值表面看起来和数组名地址的相等,但只是巧合,它们意义不同数组名的值确实是数组首元素的地址数组名的地址代表这个数组在内存中的地址数组名+1—>表示数组第1个元素的地址数组名地址+1—>表示跨过整个数组,即跨过整个数组的大小#include<stdio.h>#include<stdlib.h>int main(){ int arr[10]...原创 2019-11-04 01:13:37 · 369 阅读 · 0 评论 -
判断两个浮点数是否相等,并验证浮点数精度
一般来说,如果两个浮点数之差小于1X10-6次方我们就说这两个浮点数相等#include<stdio.h>#include<stdlib.h>#define E 1e-6int main(){ double a = 7 / 2; double b = a * 2; if (a - b < E || b - a < E) { printf...原创 2019-11-04 00:56:59 · 896 阅读 · 0 评论 -
指针数组和数组指针
数组指针数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针示范: void (*arr)[]#include<stdio.h>#include<stdlib.h>int main(){ int(*arr)[4];//定义一个数组指针 int a[][4] = { { 1...原创 2019-11-03 23:19:10 · 245 阅读 · 0 评论 -
指针函数和函数指针
指针函数#include<stdio.h>#include<stdlib.h>int* FindNum(int arr[], int count, int num){for (int i = 0; i < count; ++i){if (arr[i] == num){return &arr[i];}}return NULL;}int...原创 2019-11-03 14:53:14 · 213 阅读 · 0 评论 -
指针传参
一级指针传参传一维数组#include<stdio.h>#include<stdlib.h>int point(int* arr){ for (int i = 0; i <= 3; ++i) { printf("%d\t", arr[i]); }}int main(){ int arr[] = { 1, 2, 3, 3 }; poin...原创 2019-11-01 20:43:17 · 573 阅读 · 0 评论 -
整型截断经典实例
很多人看到这个题目第一眼,可能认为输出一次hh但结果是for循环是死循环,会一直打印为什么呢?原因包含了整型的截断当char i=256时256的二进制是0000 0001 0000 0000当将这个值赋给char时,会发生截断得到0000 0000,截断这样一个字节将其打印出来#include<stdio.h>#include<stdlib.h>int...原创 2019-10-31 23:13:42 · 864 阅读 · 0 评论 -
整型的提升和截断详解(看完包会)
**所有常量值**,在没有后缀得情况下,**默认是4个字节(int型)**将一个int型值赋给char型变量时,会发生**整形截断**(按存储顺序截断,先到先截,一个char截断一个字节即8个bit位)将char类型值按有常量值,在没有后缀得情况下,默认是4个字节(int型)将一个int型值赋给char型变量时,会发生**整形截断**(按存储顺序截断,先到先截,一个char截断一个字节...原创 2019-10-28 20:02:46 · 1477 阅读 · 1 评论 -
指针
int a=100;//有了一个房间,房间号(地址)还不知道,里面住的人(存的值)是100------->int* p=100;int* p=&a;//知道这个房间的房间号// int 类型的指针表示这个房间里住的是一个int类型的变量// p这个变量是一个指针,p里面包含的内容就是房间号// int* 也是类似一种数据类型,和int ,float等都差不多...原创 2019-10-27 15:09:43 · 142 阅读 · 0 评论 -
字节序/整形在内存中的存储
字节序对于一个整形变量来说如果高位是存在低字节的内存上,小端序如果高位是存在高字节的内存上,大端序结果证明int char都是小端序32位操作系统16进制数8位 4*8=32个bit位同类型会直接赋值#include<stdio.h>#include<stdlib.h>int main(){ int num = 0x11223344;//16进制...原创 2019-10-27 14:08:56 · 288 阅读 · 0 评论 -
位运算总结详解
位运算按位与运算 0&1=0 0&0=0 1&1=1也就是两个1才是1按位与的应用–>看一个数中有多少个1一#include<stdio.h>#include<stdlib.h>int u(int b){ int count = 0; while (b)//条件为非0(包括负数)才能进入循环 { b =b&a...原创 2019-10-21 23:09:56 · 189 阅读 · 0 评论 -
交换两个整数的值
1 用全局变量交换两个整数#include<stdio.h>#include<stdlib.h>int x = 0;int y = 0;int swap(a, b){ x = b; y = a; return (x, y); }int main(){ printf("请输入两个数\n"); int c; int d; scanf_...原创 2019-10-21 11:33:06 · 588 阅读 · 0 评论 -
c语言三子棋详解
思路:1. 定义并初始化二维数组(初始化数组一定要用{})2. 打印棋盘3. 玩家落子判断游戏是否达到结束条件提示玩家输入落子坐标判断玩家落子是否合法给二维数组赋值,即落子4. 电脑落子判断是否到达结束条件用随机数给电脑赋值坐标判断电脑落子是否合法给二维数组赋值,即落子5. 执行步骤3#define _CRT_SECURE_NO_WARNINGS//宏定义#inclu...原创 2019-10-18 23:07:45 · 520 阅读 · 0 评论 -
数组在函数中为参数
将数组作为函数的参数数组会隐退成指针—>int arr[]<=>int* arr以冒泡法为例:数组的大小本可以通过sizeof(arr)/sizeof[]求得但此时数组退化成指针sizeof(arr)所求的值就是一个指针的大小,32为系统中占4个字节(此时为32位)而此时的数组为int型占4个字节 所以相除就为1,不等于数组元素数量如果此时为char类型的数组...原创 2019-10-17 21:45:00 · 230 阅读 · 0 评论 -
(二维)数组在在内存中开辟连续空间
#include<stdio.h>#include<stdlib.h>int main(){ //数组的第一个空间大小可以省略,系统会根据里面的值自动分配 char arr[][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }; for (int row = 0; row <= 2; ++...原创 2019-10-17 21:13:11 · 686 阅读 · 0 评论 -
求第n个斐波那契数的值(递归)
#include<stdio.h>#include<stdlib.h>int Fib(int n){ if (n == 1 || n == 2)//return当n为1,2的值 { return 1; } return Fib(n - 1) + Fib(n - 2);//递归调用}int main(){ int n = 5; printf("第%...原创 2019-10-17 01:59:16 · 226 阅读 · 0 评论 -
求第n个斐波那契数的值(非递归)
#include<stdio.h>#include<stdlib.h>int Fib(int n){ int num1 = 1; int num2 = 1; if (n ==1 || n ==2)//返回n为1,2的值 { return 1; } int sum = 0;//存储前两个数字的和 for (int i = 3; i <= n; +...原创 2019-10-17 01:52:45 · 176 阅读 · 0 评论 -
求字符串长度(定义临时变量)
实现求一个字符串的长度c语言中字符串是通过字符数组的形式来模拟的字符数组本质上就是一个普通的数组,只不过存储的使char类型的元素可以用char*表示字符数组的第一个元素,然后用这个指针来表示字符串#include<stdio.h>#include<stdlib.h>int strlen(char* str)//定义一个指针类型的字符数组{ //cha...原创 2019-10-17 01:14:00 · 367 阅读 · 0 评论 -
在其他.c文件中使用一个函数
在其他.c文件中使用一个函数一 使用extern关键字extern 是计算机语言中的一个关键字,可置于变量或者函数前,以表示变量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它模块中寻找其定义1.表示函数定义在别的文件中,但在此文件要用这个函数eg: test1.c中定义了一个int ADD(int x,int y)函数//目的是声明test2.c中想用这个函数计...原创 2019-10-17 00:26:56 · 998 阅读 · 0 评论 -
输入:1234 输出:1 2 3 4
输入:1234 输出:1 2 3 4用递归实现划重点!!!----圈起来,考试要考if条件语句(不是循环语句)进入条件后,执行完就会立马退出来,执行下一步int/int=int---->整数相除截断eg: 5/2=2;123/10=12;#include<stdio.h>#include<stdlib.h>void RecNum(int num)/...原创 2019-10-15 02:21:34 · 2831 阅读 · 1 评论 -
调用函数,使得num每次都加1
话不多说,直接上代码#include<stdio.h>#include<stdlib.h>void ADD(int* n)//定义一个指针变量n,接受num的地址{ *n=*n+1;//++*n 对num地址里面的值加一}int main(){ int num = 0; ADD(&num);//传输num的地址 printf("num的值是...原创 2019-10-15 01:49:30 · 868 阅读 · 0 评论 -
将指针作为输出型参数查看函数内部执行情况
将指针作为输出型参数,通过指针修改形参的值,查看函数内部执行情况.#include<stdio.h>#include<stdlib.h>int Div(int x, int y,int* success)//定义两个形参和一个指针{ if (y == 0)//如果分母为0 { *success = 3;//将指针指向内存地址中success的值,进行赋值...原创 2019-10-15 01:32:54 · 135 阅读 · 0 评论 -
用指针交换两个变量的值
两个数的值进行交换首先错误交换姿势:因为形参是实参的副本,所以对形参这个"假身"进行操作实参的值是不会改变的#include<stdio.h>#include<stdlib.h>void swap(int x, int y){ int temp; temp = x; x = y; y = temp;}int main(){ int a = ...原创 2019-10-15 00:56:41 · 3620 阅读 · 0 评论 -
goto语句
goto语句goto语句也称为无条件转移语句,可以跳出多重循环其一般格式如下:goto 语句标号;其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto 语句配合使用。eg#include<stdio.h>#include<stdlib.h>int main(){ while (1) {...原创 2019-10-15 00:26:15 · 1039 阅读 · 0 评论 -
键盘输入字符,大小写转换
编写一个程序,可以一直接收键盘字符,如果是小写字符就输出对应的大写字符,如果接收的是大写字符,就输出对应的小写字符,如果是数字不输出#include<stdio.h>#include<stdlib.h>//#include<ctype.h>int main(){ char al; scanf_s("%c", &al); //if ...原创 2019-10-15 00:08:29 · 802 阅读 · 0 评论 -
二分法查找有序数组是否含有指定元素
//二分法查找有序数组是否含有指定元素//写代码可以在整型有序数组中查找想要的数字,//找到了返回下标,找不到返回 - 1.(折半查找)#include<stdio.h>#include<stdlib.h>void FindNum(int arr[],int n)//arr[]定义一个要传入的数组参数,n定义要找的数字{ int left = 0;//数组左...原创 2019-10-14 22:29:44 · 513 阅读 · 0 评论