C语言内存函数
memcpy包含在头文件<string.h>中语法格式 1void * memcpy ( void * destination, const void * source, size_t num ); 从 source 的位置开始拷贝 num 个字节的数据到 destination 指向的位置 12345678//memcpy 针对内存块进行拷贝int arr1[] = { 1,2,3,4 };int arr2[4] = { 0 };memcpy(arr2, arr1, 4 * sizeof(int));for (int i = 0;i < 4;i++){ printf("%d ", arr1[i]);} 遇到 ‘\0’ 不会停下来 如果 destination 和 source 有任何的重叠,拷贝的结果是未定义的 12345678910// 如果 destination 和 source 有任何的重叠,拷贝的结果是未定义的int arr1[10] = { 1,2,3...
C语言深入研究指针3
字符指针变量常规使用方法 123char ch = 'A';char* pch = &ch;*pch = 'w'; 还有另一种使用方法 12char* pstr = "hello world!";printf("%s\n", pstr); 字符型指针变量存放的是字符串首元素的地址 来看看下面的代码 123456789101112char str1[] = "hello world.";char str2[] = "hello world.";const char* str3 = "hello world.";const char* str4 = "hello world.";if (str1 == str2) printf("str1 and str2 are same\n");else printf("str1 and str2 are not same\n");if (...
C语言深入研究指针2
数组名的理解数组名本来就是地址,来做一个测试 123int arr[5] = { 1,2,3,4,5 };printf("%p\n", arr);printf("%p\n", &arr[0]); 可以看到数组名本来就是地址,是数组首元素的地址 那么就可以使用数组名完成遍历数组 123456int arr[5] = { 1,2,3,4,5 };for (int i = 0;i < 5;i++){ int n = *(arr + i); printf("%d ", n);} 数组名通常来说就是数组首元素的地址,但是有两个特殊情况 1234int arr[5] = { 1,2,3,4,5 };printf("%p\n", &arr[0] + 1);printf("%p\n", &arr + 1);printf("%zd\n", sizeof(arr)); ...
C语言深入研究指针1
内存和地址内存在生活中,一栋楼里面有若干个房间,每个房间有其对应的门牌号。 类似的,在计算机中,会把内存分成若干个内存单元。每个内存单元的大小取一 个字节。每一个内存单元都会有一个唯一的编号。 C语言给内存单元的地址起了一个新名字叫指针。 指针变量和地址& 取地址符C语言中创建变量其实就是向内存申请空间。 整型变量是向内存申请了4个字节的。 要拿到这个整型变量的地址就需要用到 & 取地址操作符。 & 操作符取出的是所占字节中地址较小的字节的地址。 指针变量和取地址操作符指针变量用于存放指针的变量称为指针变量。 12int a = 10;int* p = &a; 存放在指针变量中的值都会被认为是地址。 如何拆解指针类型12 int a = 10;int* p = &a; 这里 可以将 int * 分开来看, * 说明变量 p 是一个指针类型变量,int 说明 p 这个 指针变量指向的是 int 类型的变量。 解引用操作符将地址保存于指针变量中,要使用的话就需要用到解引用操作符 * 1234int a = 10;int* p = &...
操作符详解
操作符分类 原码、反码、补码整数的2进制表示方法有三种,即原码、反码、补码。 有符号的三种表示方法均有符号位和数值位两部分组成。 首位被当作符号位,剩下的均为数值为。 符号位用0表示正,用1表示负。 正整数的原码、反码、补码都相同。 负整数的三种表示方法各不相同。 原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。 反码:原码的数值位取反,符号位不变。(0变1,1变变0) 补码:反码 + 1。 例如:对于整型来说,其实存放在内存中的就是他的补码。 123456int a = -10;// 原码就是 a 的二进制表示// 一个整型数在内存中占 4 个字节(32 位),一个字节由8个 bit 位组成,所以 a 的二进制表示为:// 10000000 00000000 00000000 00001010 就是原码// 11111111 11111111 11111111 11110101 就是 a 的反码// 11111111 11111111 11111111 11110110 就是 a 的补码 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将 ...
C语言扫雷游戏的简单实现
猜数字游戏使用函数对前面的猜数字游戏引入自定义函数。 将函数的声明放入 function.h 文件中,函数的定义放进 func.c 文件,主函数放在 game.c 中 123456789// function.h#pragma once#include <stdio.h>#include <stdlib.h>#include <time.h>//这是游戏的函数声明文件,包含了游戏的主要功能函数。void menu(); // 显示游戏菜单void game(); // 进行游戏的主要逻辑 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253// func.c#define _CRT_SECURE_NO_WARNINGS 1#include "function.h";// 这是实现文件,包含函数的具体实现void menu(){ // 显示游戏菜单 printf("...
函数递归
概念简单点说,递归就是函数自己调用自己。 12345函数A(){ …… 函数A()} 递归的思想递归中的递就是递推的意思,归就是回归。 递归的思想就是把大事化小的思想。 递归的限制条件 递归存在限制条件,当满足这个限制条件后,递归不再继续。 每次调用递归后会越来越接近这个限制条件。 示例求 n 的阶乘12345678 int Fact_Nor(int n){ // 采用循环方式实现阶乘 int i, s = 1; for (i = 1; i <= n; i++) s *= i; return s;} 123456789101112int Fact_Rec(int n){ // 采用递归方式实现阶乘 if (n == 1) { return 1; } else { return n * Fact_Rec(n - 1); }} 12345int n;printf("请输入一个整数:");scanf("%d"...
C语言函数
函数的概念C语言中的函数就是一个完成某项特定的任务的一段代码,有时候被翻译成子程 序。这段代码是有特殊的写法和调用方法的。使用函数可以实现代码复用,提升 开发效率。 在C语言中一般会遇到两种函数: 库函数 自定义函数 库函数标准库和头文件C语言并不提供库函数。 ANSI C 规定了一些常用的函数标准,被称为标准库。 不同的编译器厂商根据标准库给出一系列函数实现。这些函数被称为库函数。 比如 printf() scanf() 各种编译器的标准库中提供了一系列的库函数,这些库函数根据功能的划分,都 在不同的头文件中进行了声明。 头文件包含库函数是在标准库中对应的头文件中声明的,所以库函数的使用必须包含对应的 头文件。 自定义函数语法形式12345ret_type fun_name(形式参数){} ret_type 是函数返回值的类型,酌情设置,没有返回值就是 void 。 fun_name 是函数名,方便使用。 括号中放的是形式参数,不需要参数也可以用 void 。 如果有参数需要指 明参数类型和参数个数。 {}中是函数体,完成函数的计算过程。 ...
C语言数组
数组的概念数组是一组相同类型元素的集合。 数组中元素个数不能为0. 数组中数据类型是相同的。 一维数组的创建和初始化一维数组的创建语法格式如下: 1type arr_name[常量值]; 存放在数组的值称为数组的元素,数组在创建时可以指定数组的大小和数组的元 素类型。 比如: 1int arr1[10] = { 0 }; 一维数组的初始化在数组创建时给数组一些初始值叫做初始化。 123int arr1[3] = { 0,1,2 }; //完全初始化int arr2[3] = { 0,1 }; //部分初始化,剩余元素自动初始化为0//int arr3[3] = { 1,2,3,4 }; // 错误,初始化元素个数超过数组大小 数组的类型123int arr1[10]int arr2[5]char arr3[10] 一维数组的使用数组下标C语言中规定数组是有下标的,下标从0开始。假设数组有n个元素,那么第n个元 素的下标就是 n - 1 。 C语言为数组访问提供了操作符[],叫下标引用操作...
C语言猜数字游戏的简单实现
游戏要求: 代码运行后自动生成1~100的随机数。2.猜大猜小都会给出反馈。 随机数生成randC语言中提供了一个函数叫 rand ,可生成随机数。 rand 函数会返回一个伪随机数,这个随机数的范围是 0 ~ RAND_MAX 之间。 使用 rand 需要包含一个头文件 stdlib.h 。 在 visual studio 2026 中 RAND_MAX 值是 32767。 12345printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand()); 运行几次上述代码发现每次生成的随机数都一样,这不符合需求。因为 rand 函 数是伪随机,是基于一个“种子”的基准值进行运算生成的随机数。 要想让每次生成的随机数不一样,就得在每次生成前改变这个“种子”。 srandC语言中提供了一个函数 srand , 用来初...





