c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第一式】数据的存储

【C语言】深度剖析数据存储的底层原理 我们每天都在和“数据“这位好兄弟打交道,而你对他又了解了多少? 阅读详情

c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第一式】数据的存储

【心法】
【第零章】c语言概述
【第一章】分支与循环语句
【第二章】函数
【第三章】数组
【第四章】操作符
【第五章】指针
【第六章】结构体
【第七章】const与c语言中一些错误代码
【禁忌秘术】
【第一式】数据的存储
【第二式】指针
【第三式】字符函数和字符串函数
【第四式】自定义类型详解(结构体、枚举、联合)
【第五式】动态内存管理
【第六式】文件操作
【第七式】程序的编译



前言

本章节的重点是

  • 数据类型详细介绍
  • 整型在内存中的的存储:原码、反码、补码
  • 大小端字节序介绍及判断
  • 浮点型在内存中的存储解析

一、类型的介绍

在前面章节中我们已经学习了基本的内置类型:

char // 字符数据类型
short // 短整型
int // 整型
long // 长整型
long long // 更长的整型
float // 单精度浮点数
double // 双精度浮点数
// c语言有没有字符串类型?
// 没有

以及他们所占存储空间的大小。
类型的意义:

  1. 使用这个类型开辟内存空间的大小(大小决定了使用范围)
  2. 如何看待内存空间的视角

1.类型的基本归类

整型家族:

// 整形家族
char
	unsigned char
	signed char
short 
	unsigned short
	signed short
int
	unsigned int 
	signed int 
long 
	unsigned long [int]
	signed long [int]

浮点数家族:

float
double

构造类型:

// 数组类型
// 结构体类型 struct
// 枚举类型 enum
// 联合类型 union

// 数组类型
int arr1[10]; // 数组类型为int [10]
char arr2[5]; // 数组类型为char [5]
float arr3[7]; // 数组类型为float [7]

// 结构体类型 
struct Stu
{
	char name[20];
	int age;
}

// 枚举类型
enum {
	Monday, // 默认为0
	Tuesday,
	Wednesday,
	Thursday,
	Friday,
	Saturday,
	Sunday
}

// 联合类型
union Un
{
	int i;
	char ch;
};

整型家族没什么可讲的,后三种会在后续章节介绍。

指针类型:

int *pi;
char *pc;
short *ps;
long *pl;
float *pf;
void *pv;

空类型:

void 表示空类型(无类型)
通常用于函数的返回参数、函数的参数、指针类型

二、整型在内存中的存储

众所周知,变量的创建是要在内存中开辟空间的。空间的大小是由变量的类型来决定的。

接下来我们就来讨论,数据在开辟给它们的内存中是如何存储的?

比如:

int a = 10;
int b = -20;

我们都知道,int类型占据4个字节的空间,那么它们在这4个字节中是如何存储的呢?
我们先了解下面的概念。

1.原码、反码、补码

计算机中的整数有三种表示方式:原码、反码、补码。
这三种表示方式都有:符号位和数值位两部分,符号位都是用0表示“正”,用1表示 “负”;
而数值位则是两种情况:
正数的原码、反码、补码都相同。
负数的这三种表示方式各不相同。

原码:
直接将二进制按照绝对值的形式翻译成二进制,再将符号位置1即可。
反码:
将原码的符号位不变,其他位依次按位取反即可。
补码:
反码 + 1即可得到。

对于整型来说,数据在内存中是以补码的形式存储的。
这是为什么呢?

在计算机系统中,数值一律以补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理。
同时,加法和减法也可以统一处理(CPU只有加法器),此外,补码和原码之间的转换,使用的逻辑相同,运算过程相同,不需要额外的电路。
原码 -> 反码 -> 反码 + 1 == 补码
补码 -> 反码 -> 反码 + 1 == 原码

让我们来看看变量a和b在内存的存储:
在这里插入图片描述

在这里插入图片描述
可以看到内存中存储的值好像是它们的补码,但它们的存储顺序好像比较奇怪,倒过来了?
这又是为什么呢?

2.大小端介绍

什么是大端小端?

大端(存储)模式:指数据的高位存放在内存中的低地址,而数据的低位,保存在内存的高地址中;
小端(存储)模式:指数据的低位存放在内存中的低地址,而数据的高位,保存在内存的高地址中;

一个数据所占空间大于1个字节时,和数组的空间使用类似,从低位用到高位;
0a是变量a的值的低位,存放在内存分配给它的空间的低位地址上,显然上面的例子中,机器使用的就是小端存储模式。

那为什么要有大端小端呢?
这是因为在计算机系统中,我们的数据是以字节为单位进行存储的,每个地址都代表一个字节,但c语言中除了只占一个字节的char类型之外,还有长度大于1字节的类型,如short、int、long、float等等。另外,对于位数大于8位的处理器,由于其寄存器宽度大于一个字节时,此时对于这些数据,应付存在它们是以何种顺序安排在这片空间的问题。因此就有了大端和小端两种存储模式。

一道百度笔试题:
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序

// 方法一
#include <stdio.h>

int main()
{
	int a = 1;
	char *ch = (char*) &a;
	(*ch == 1)?printf("小端\n"):printf("大端\n");

	return 0;
}

在这里插入图片描述
运行结果:
在这里插入图片描述

还有另一种方法 - - 使用联合体union

#include <stdio.h>

int main()
{
	typedef union
	{
		char ch;
		int i;
	} Un;

	Un un;
	un.i = 1;
	(un.ch == 1) ? printf("小端\n") : printf("大端\n");

	return 0;
}

关于联合体如何使用,请看后续章节详解。

3.一些练习

练习1

#include <stdio.h>

int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("%d, %d, %d\n", a, b, c); // 会输出什么?

	return 0;
}

分析:
a,b,c都是用-1赋值的,所以它们在内存中的值都是11111111
在printf()函数中要以int类型的格式输出时,因为长度不足4个字节,需进行整型提升
变量a和b都是有符号的变量,在整型提升时需要考虑符号位(最高位),它们的符号位为1,所以用1补足至4个字节,此时它们的值为11111111111111111111111111111111,转换为int类型,它表示-1;
变量c是无符号的变量,整型提升时直接补0即可,此时它的值为00000000000000000000000011111111,表示255。
所以该代码输出为:
-1, -1, 255

运行结果:
在这里插入图片描述

练习2

#include <stdio.h>

int main()
{
	char a = -128;
	printf("%u\n", a);

	return 0;
}

分析:
-128的补码为11111111111111111111111110000000,将其赋值给char类型的变量a,此时会进行截断处理,a的内存空间中保存的值是10000000。
要以无符号整型的格式输出,此时要进行整型提升,a是有符号的变量,以其符号位补足4字节,补码为11111111111111111111111110000000,将该补码以无符号的格式输出,输出结果为4294967168

运行结果:
在这里插入图片描述

练习3

#include <stdio.h>

int main()
{
	char a = 128;
	printf("%u\n", a);

	return 0;
}

分析:
128的补码为00000000000000000000000010000000,a中保存的值为10000000,输出打印时,需要整型提升,a为char类型有符号,补1,此时补码为11111111111111111111111110000000,输出4294967168。

运行结果:
在这里插入图片描述

练习4

#include <stdio.h>

int main()
{
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);

	return 0;
}

分析:
-20的补码为11111111111111111111111111101100,10的补码为00000000000000000000000000001010,无符号整型+有符号整型,结果会隐式转换为无符号整型,结果的补码为11111111111111111111111111110110,以有符号整型的格式输出,所以输出结果为-10。

运行结果:
在这里插入图片描述

练习5,下面代码会输出什么?

#include <stdio.h>

int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
	}

	return 0;
}

分析:
此程序会陷入死循环;
变量 i 是一个无符号整型,它的最小值就是0,出就是说 i 不可能小于0,这个for判断条件恒为真,所以陷入了死循环。

运行结果:
在这里插入图片描述

练习6

#include <stdio.h>
#include <string.h>

int main()
{
	char a[1000];
	int i;

	for (i = 0; i < 1000; i++)
	{
		a[i] = -i - 1;
	}
	printf("%d\n", strlen(a));


	return 0;
}

分析:
该程序在for循环中对char类型的数组赋值,并在结束时输出该char数组的长度,也就是要找数组中’\0’是位置,'\0’对应的ASCII码值为0,也就是要找一个 i 使得 -1 - i的二进制后八位全为0,-1的补码为11111111111111111111111111111111,离它最近的满足条件的补码为11111111111111111111111100000000,也就是-256,所以 i == 255时,a[i] == ‘\0’。

运行结果:
在这里插入图片描述

练习7

#include <stdio.h>

unsigned char i = 0;

int main()
{
	int count = 0;
	for (i = 0; i <= 255; i++)
	{
		printf("hello world, ");
		printf("count == %d\n", ++count);
	}

	return 0;
}

分析:
变量 i 是一个无符号的char类型,取值范围为0 ~ 255,所以这也是一个死循环。

运行结果:
在这里插入图片描述

三、浮点型在内存中的存储

常见的浮点数

3.14159
1E10
浮点数家族包括:float、double、long double类型。
浮点数表示的范围:在float.h中定义

1.一个例子

浮点数存储的例子:

#include <stdio.h>

int main()
{
	int n = 9;
	float *pf = (float*)&n;
	printf("n的值为:%d\n", n);
	printf("*pf的值为:%f\n", *pf);

	*pf = 9.0;
	printf("n的值为:%d\n", n);
	printf("*pf的值为:%f\n", *pf);

	return 0;
}

运行结果:
在这里插入图片描述
可以看到,使用整型格式和浮点数格式打印的结果并不相同。
这就说明了,整型数据和浮点数的内存格式是不同的。
整型数据在内存中是以补码的形式存储的,那么浮点数在内存中是如何存储的呢?

2.浮点数的存储规则

根据国际标准IEEE754,任意一个二进制浮点数V可以表示成下面的形式:

-1 ^ S * M * 2 ^ E
-1 ^ S表示符号位,当S=0时,表示正数;S=1时,表示负数;
M表示有效数字,大于等于1,小于2;
2 ^ E表示指数位;

举个例子
十进制的5.0,写成二进制为101,相当于1.01 * 2 ^ 2。
那么按照上面的V的形式,S=0,M=1.01,E=2。
十进制的-5.0,写成二进制为-101,相当于-1.01 * 2 ^ 2。
写成V的形式,S=1,M=1.01,E=2。

IEEE754规定:
对于32位的浮点数,最高的1位为符号位S,接着的8位为指数位E,剩余的23位为有效数字M。
在这里插入图片描述
对于64位的浮点数,最高的1位为符号位S,接着的11位为指数位E,剩余的52位为有效数字M。
在这里插入图片描述
IEEE754对有效数字M和指数E,还有一些特殊规定。
有效数字M:
存入内存:
因为有效数字M的取值范围为1≤M<2,所以M的第一位永远都是1,所以该位可以省略,直接从小数点后的第一位开始存储。
比如保存1.01时,只保存01,等到要读取的时候再把第一位的1加上。这样做的目的是节省一位有效数字。以32位的浮点数为例,M只有23位,将第一位的1省略,就可以保存24位有效数字。
指数E:
首先,E是一个无符号整数;
如果E为8位,那么E的取值范围为0~255;如果E为11位,那么E的取值范围为0~2047。但这存在一个问题,科学计数法中的E是可能出现负值的,所以IEEE 754规定,存入内存的E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数为1023。
比如:2 ^ 10,此时E=10,所以保存为32位浮点数时,指数E必须保存为10 + 127 = 137,即10001001
从内存中取出:分为三类

  1. E不全为0或不全为1:
    这时浮点数的值就采用下面的规则,E的计算值(保存在内存中的值)减去127(或1023),得到指数E的真实值,M的前面加上第一位的1。
    例如,0.5的二进制形式为0.1,由于有效数字M必须在1和2之间,所以写成,1.0 * 2 ^ -1,M为1.0,写入内存中时去掉第一位的1,所以就是23个0,指数E的真实值为-1,存入内存需要+127,所以E的计算值为126,所以内存中的E为01111110,0.5为正数,符号位S=0,所以0.5在内存中的二进制为0 01111110 00000000000000000000000,写成十六进制为0x3f000000。
    在这里插入图片描述
    可以看到这里是小端字节序。

2.E全为0:
此时E的真实值固定为1 - 126(或1 - 1023),有效数字M不再加上第一位的1,而是直接还原成0.xxxxxx的小数。这样用来表示±0,以及接近0的很小的数字。
换个角度想想,指数E在+127之后都还是全0,那么这个数至少都是M * 2 ^ -127,2 ^ -127这是一个极小的数了,也就相当于0。
在这里插入图片描述
测试代码在下面。

  1. E全为1
    这种情况最简单,有效数字M全为0表示无穷大(inf);不全为0表示无效数字(NaN)。
    在这里插入图片描述
    测试代码在下面
// 指数 E全为 0
#include <stdio.h>

int main()
{
	float f = 0.5;
	int i = 7340032; // 0000 0000 0111 0000 0000 0000 0000 0000 -- 0x0070 0000
	float *pf = &i;
	printf("*pf == %f\n", *pf);
	
	i = -2140143616; // 1000 0000 0111 0000 0000 0000 0000 0000 -- 0x8070 0000
	pf = &i;
	printf("*pf == %f\n", *pf);

	return 0;
}
// 指数 E全为 1
#include <stdio.h>

int main()
{
	float f = 0.5;
	int i = 2146435072; // 0111 1111 1111 0000 0000 0000 0000 0000 -- 0x7ff0 0000
	float* pf = &i;
	printf("*pf == %f\n", *pf);

	i = -1048576; // 1111 1111 1111 0000 0000 0000 0000 0000 -- 0xfff0 0000
	pf = &i;
	printf("*pf == %f\n", *pf);

	i = 2139095040; // 0111 1111 1000 0000 0000 0000 0000 0000 -- 0x7f80 0000
	pf = &i;
	printf("*pf == %f\n", *pf);

	i = -8388608; // 1111 1111 1000 0000 0000 0000 0000 0000 -- 0xff80 0000
	pf = &i;
	printf("*pf == %f\n", *pf);

	return 0;
}

这下我们讲解了浮点数在内存中是如何存储的之后,我们再来看看,最开始的例子:
在这里插入图片描述

9的二进制形式为00000000000000000000000000001001,将其以浮点数格式输出,此时的E为全0,对应第二种情况,所以输出0。
浮点数9.0的二进制数为1001,有效数字M为1.001,E的真实值为3,所以E的计算值为130,表示为二进制为10000010,符号位S为0,所以内存中的值为0 10000010 00100000000000000000000对应十六进制为0x41100000,对应10进制数为1091567616,结果符合预期。


总结

本节详细的介绍了c语言中定义的类型在内存中是以何种形式进行保存的,在学习完这部分之后,应该尽量在写代码或读代码时,就能像是在看内存一样,这样能减少许多逻辑正确,但因为数据保存在内存的格式与预期设计不符而出现的错误。

数据结构剑法(演示代码为C语言)——本剑法一共九式 一个数据元素可以由若干个数据项组成。数据项是数据不可分割的最小单位。比如,人这样的数据元素,有眼睛、耳朵、鼻子、嘴巴、手、脚等数据项。也有姓名、年龄、性别等数据项。具体有哪些数据项,要看你针对的是什么系统了。不同的数据元素之间不是独立的,而是存在特定的关系,将这些关系称为结构。所以数据结构就是:相互之间存在一种或多种特定关系的数据元素的集合。(首先是数据元素的集合,其次这些数据元素之间存在一种或多种特定关系)(如图7)图7恭喜你,亲爱的,你已经学会了数据结构剑法的第一式。 阅读详情

相关推荐

实战指南:如何用DCCRN模型提升语音增强效果(附代码示例)

本文提供了基于DCCRN模型进行语音增强的实战指南。通过深入解析复数网络如何协同处理语音的幅度与相位信息,并附有完整的PyTorch代码实现,帮助开发者从数据准备、模型搭建到训练调优,构建高效的实时语音增强系统,有效提升嘈杂环境下的语音清晰度。

weixin_29054245的博客 478

c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第二式】指针

字符指针数组指针指针数组数组传参和指针传参几种数组、指针之间的比较函数指针函数指针数组指向函数指针数组的指针回调函数指针和数组的笔试题指针是一个存储地址的变量,地址是一块内存空间的唯一标识;指针的大小是固定的(4字节或8字节);指针是有类型的,它的类型决定它 + - 整数时移动的步长、*解引用操作时的权限;指针是能够进行运算的,+ - 整数、指针相减、指针的关系运算;接下来,就让我们继续探讨指针的进阶主题。对于普通的指针,我们都已经很熟悉了。

PLKDTHFS的博客 1518

LinuxMint 22.1(Ubuntu24.04)下通过Wine完美运行同花顺远航版的实战指南

本文详细介绍了在LinuxMint 22.1(Ubuntu24.04)系统下通过Wine完美运行同花顺远航版的实战指南。从基础环境准备到深度优化,包括Wine环境配置、同花顺远航版安装、字体显示调优、任务栏兼容性修复等关键步骤,帮助Linux用户高效使用同花顺远航版进行股票交易和行情分析。

weixin_30919429的博客 570

c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第六式】文件操作

为什么使用文件什么是文件文件的打开和关闭文件的顺序读写文件的随机读写文本文件和二进制文件文件读取结束的判定文件缓冲区磁盘上的文件就是文件。但是在程序设计上,我们谈到的文件一般有两种:程序文件、数据文件;本节详细的对c语言中数据文件的使用进行了详细的介绍,包括对文件读写操作使用的函数,以及通过文件位置指针的操作函数来对文件进行随机读写,并指出了feof函数可能出现的使用错误,在最后,介绍了文件缓冲区的概念;

PLKDTHFS的博客 1226

ONNC Open Neural Network Compiler 开源神经网络编译器 一个 开源、模块化、可重用编译器算法和工具链的库,专门针对深度学习加速器(DLA)部署导入ONNX模型

ONNC是一个集合了开源、模块化、可重用编译器算法和工具链的库,专门针对深度学习加速器(DLA)。ONNC从底层开始构建,旨在将ONNX中间表示(IR)翻译成专有DLA代码。其软件架构设计强调可移植性和可重用性,从而简化了开发新后端的工作。上图展示了ONNC软件栈的顶层框图。软件栈从导入ONNX计算图模型到输出相应的硬件二进制文件,展示了各个功能块。

万有文的博客 1992

超详细!新手必看STM32-DMA配置与实验(串口使用DMA发送数据)

DMA就是:直接存储器访问。DMA传输数据从一个地址空间复制到另一个地址空间,提供在外设和存储器或者存储器和存储器之间的高速数据传输。

qq_1033275663的博客 2万+

c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第五式】动态内存管理

大家在使用数组时肯定都会有过这样的疑问,如果一个数组的长度不足了,可以延长这个数组吗?使其能够满足存储的需求。又或者是现在不确定数组应该设为多长,先把它放着,等之后再设置它的长度。上面的这些需求,数组显然是无法实现的,那么c语言中有什么东西能够做到这一点呢?动态内存分配!你现在不知道需要多大的空间,没关系,之后你明确了的时候,使用动态内存分配,将你要的空间分配给即可。为什么存在动态内存分配动态内存函数的介绍mallocfreecallocrealloc常见的动态内存错误。

PLKDTHFS的博客 1293

Claude Code 错误解决方案 API Error: 前缀通用错误

本文分析了Claude Code与Anthropic API通信时出现的通用错误处理问题。当API返回未分类错误时,系统会直接显示"API Error: "前缀的原始错误信息。通过错误链路追踪发现,这是由于未匹配特定错误类型时触发了通用兜底处理逻辑。文章提供了三种解决方案:查看具体错误内容、启用调试日志以及提交问题反馈,并建议用户关注错误码、使用/compact命令处理上下文超限问题。最后强调这些未分类错误是预期行为,用户应通过错误消息中的线索自行排查或反馈开发者。

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1346

c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第七式】程序的编译

程序的翻译环境程序的执行环境c语言程序的编译+链接预定义符号介绍预处理指令#define宏和函数的对比预处理操作符#和##的介绍命令定义预处理指令#include预处理指令#undef条件编译__FILE__ // 进行编译的源文件__LINE__ // 文件当前行号__DATE__ // 文件被编译的日期__TIME__ // 文件被编译的时间__STDC__ // 如果编译器遵循ANSI C,其值为1,否则未定义。

PLKDTHFS的博客 1195

ardupilot 日志分析《xKF1信息》

ardupilot 日志分析系列将会把ardupilot所有的日志文档进行分析,为我们分析无人机的运行状态,炸鸡原因,传感器状态,电机状态,控制信息,滤波信息做准备。本节主要分析xKF1日志信息,欢迎批评指正。学习好ardupilot必须会分析飞行日志,从飞行日志中我们可以学到很多无人机的知识。无人机是综合知识的体现,涵盖:导航、控制、滤波、算法、协议等各种知识,只有更全面的学习,才能在无人机的道路上越走越远。

陌城烟雨 1225

【AI智能体】Langchain 主流大模型调用与对话API使用详解

【AI大模型】Langchain 模型调用与对话API使用详解

congge_study的博客 406

c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第三式】字符函数和字符串函数

c语言中对字符和字符串的处理非常频繁,但c语言本身是没有字符串类型的,字符串通常存储在常量字符串或字符数组中。常量字符串适用于不需要对其进行修改的字符串函数。strlen函数的作用是获得一个字符串的长度;接收一个const修饰的字符指针变量,这个指针指向的字符串必须有结束符\0;返回一个无符号(易错点)的int类型的数值,表示这个字符串的长度(不包括结束符\0如果没有返回值,则表示出错;// 使用示例int main()printf("a的长度 = %d\n", strlen(a));

PLKDTHFS的博客 926

[VT虚拟化驱动]安装DPC回调检测CPU对VT的支持

文章目录前言一、驱动基本框架二、安装DPC回调三、检测CPU对VT的支持本章代码def.h:DriverEntry.cpputil.cpp 前言 对于VT的介绍网上有很多详细的介绍,这里不再赘述,只需要知道它有比操作系统还高的权限,可以利用这一点进行某些操作,如内存隐藏, 无痕HOOK ,MSR HOOK, 调试或者反调试, 这里直奔主题 一、驱动基本框架 虚拟机设置里虚拟化引擎设置: 新建一个空的WDM工程,平台设置为x64平台,右键属性——>Inf2Cat——>Run Inf2Cat设置

吾无法无天的博客 3907

c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第四式】自定义类型详解(结构体、枚举、联合)

c语言中虽然定义得有许多的类型,如char、int、double等等,但是现实生活中需要描述的问题,仅仅使用这些已有类型是不够的,所以在c语言中,程序员可以根据自己的需要,定义出自己的类型结构,以满足需求。结构体:结构体类型的声明结构的自引用结构体变量的定义和初始化结构体内存对齐结构体传参结构体实现位段(位段的填充&可移植性)枚举枚举类型的定义枚举的优点枚举的使用联合联合类型的定义联合的特点联合的使用有了结构体类型,之后应该如何定义变量呢?

PLKDTHFS的博客 989

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C语言修炼秘籍【第零章】c语言概述

c语言是一门编程语言。语言的作用就是交流,人们可以利用它与计算机进行交流,让计算机知道你需要它完成什么工作。本系列文章是对笔者在c语言学习的总结记录。本文会先粗略的介绍c语言中需要学习的内容。

PLKDTHFS的博客 1664

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

c语言修炼秘籍【第二章】函数

本文会从函数是什么开始,逐一介绍函数的语法结构,如何声明和定义一个函数,函数的参数类型,调用函数时的传参类型,函数的调用方式,函数递归,并在最后对汉诺塔、青蛙跳台阶和八皇后问题进行详细分析(包含全部代码)

PLKDTHFS的博客 1442

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

c语言修炼秘籍【第三章】数组

本文将会介绍常用到的一维数组和二维数组是如何使用及它们在内存中是如何存储,说明何为数组越界,并讨论数组在作为函数参数时应该如何使用。在最后附带三子棋和扫雷的代码实现详解。本文对一维和二维数组的初始化、创建、使用,作出的简要的介绍,并通过冒泡排序算法的实现,详细说明了当数组作为函数参数时的性质 - - 传递的是首元素地址。在最后,给出了两个数组的使用实例,附带了完整的实现代码,并配有详细注释。

PLKDTHFS的博客 1257

c语言修炼秘籍【第五章】指针

本文会从介绍指针是什么开始,循序渐进地介绍指针的使用、指针使用时会遇到的问题、指针能进行哪些运算、指针与数组之间的关系,以及指针数组这些内容。本文对c语言中使用的指针进行了较简略的介绍,包括什么是指针,指针类型有什么用,指针的一些运算,什么是野指针,如何利用指针访问数组,二级指针使用中会出现的问题,以及指针数组。

PLKDTHFS的博客 1763

c语言修炼秘籍【第一章】分支与循环语句

在处理现实中的问题时,我们总会遇到需要作出选择或是需要重复多次的完成一种事件。你去图书馆学习,需要日复一日的坚持,每多学一天,你的代码功力就能+1,当你的代码功力,达到了某一程度,你就能够迎娶白富美,走上人生巅峰。为了实现这些目的,c语言提供了分支语句,用以实现选择;提供循环语句,用以实现重复多次的机械活动;表达式语句函数调用语句控制语句复合语句空语句分支、循环语句属于控制语句。控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由各种特定的语句定义符构成;

PLKDTHFS的博客 1244

C语言修炼——内存函数与数据的存储

函数memcpy从source的位置开始向后复制num个字节的数据到指向的内存位置与source所指向内存空间中存储的两段数据的类型互不相干,数据在内存中的存储都是以二进制文本的形式,memcpy是从字节的层面复制所有的二进制信息这个函数在遇到'\0'的时候并不会停下来,而是复制完指定的字节数如果source和有任何的重叠,复制的结果都是未定义的为了避免overflows,需要确保与source指向的数组的大小至少为num对于重叠的内存,需要用memmove进行复制memcpy。

Meanlong_的博客 1382

C语言修炼秘籍之——操作符

内些个操作符到底怎么个事儿啊?二进制及其及其进制转换是个什么玩意儿啊?原反补我到现在都还妹学明白你能给我教会唠?这位客官,咱里边儿请,且听我娓娓道来~

2301_80029060的博客 1532

c语言修炼秘籍【第四章】操作符

本文会对c语言中使用到的操作符进行介绍,包括算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号表达式下标引用、函数调用和结构成员表达式求值单目操作符的种类!// 逻辑反操作- // 负值+ // 正值& // 取地址sizeof // 操作数的类型长度(以字节为单位)~ // 按二进制位取反++ // 前置、后置++-- // 前置、后置--* // 间接访问操作符(解引用操作符) -- 指针的使用。

PLKDTHFS的博客 1136

内功修炼:数据在内存中的存储

我们在之前的学习中仅仅只知道数据在计算机中是以二进制的形式存储的,那么我们今天就一起来探讨一下它到底是怎么存起来的。

2301_81510906的博客 1943

c语言修炼秘籍【第六章】结构体

将结构体与数组进行对比:数组是一组相同类型的元素集合;结构体是一些值的集合,它们类型可以不同,这些值被称为成员变量。使用结构体类型定义变量int x;int y;} p1;// 声明类型的同时定义变量p1// 定义结构体变量 p2// 初始化:定义变量的同时赋初值struct Stu// 名字int age;// 年龄int data;// 结构体嵌套的初始化// 结构体嵌套的初始化本文对c语言中使用到的结构体进行了简单介绍,更详细的会在后续攻略中详解。

PLKDTHFS的博客 761

C语言(进阶)数据的存储修炼内功

c进阶修炼内功

weixin_67900732的博客 4710

c语言修炼秘籍【第七章】const与c语言中一些错误代码

而数组内部的内存使用分配是从低到高的,arr[0]的地址在最低位,当循环进行到第11次 - - arr[11]设置的其实是i的值,此时将 i 的值设为了0,循环继续。这是因为,程序要进行报错也是需要执行时间的,访问arr[11]时程序仍处于循环中,没有时间报错就又进入了下一次循环。test1()可以正常使用指针对n为进行修改,也可以对p指向的位置进行修改。test2()不能通过指针对n进行修改,可以对p指向的位置进行修改。,arr后分配,地址会比i的地址低,分配到的地址为。,i先分配空间,地址为。

PLKDTHFS的博客 674
上一篇: c语言修炼秘籍【第七章】const与c语言中一些错误代码
下一篇: c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第二式】指针
YKPG
博客等级 码龄6年 344粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值