C语言初阶学习笔记

news2025/1/12 21:05:16

个人主页:点我进入主页

专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂。

目录

1.复杂概念 

1.1大小端

1.2 整形提升

1.2.1整形提升的意义:

1.2.2整形提升规则

1.2.3实例

2.特定功能

3.栈区内存销毁导致的错误

3.1数据交换

 3.2栈区定义数组


        经过很长时间的学习C语言初阶,我都有一些迫不及待的为大家展示展示我的C语言初阶笔记了,这个博客主要讲C语言初阶中复杂概念,特定功能,栈区内存销毁导致的错误等内容。

1.复杂概念 

1.1大小端

大端存储是指数据的高位放在低地址存储,数据的低位放在高地址存储。

小端存储是指数据的低位放在低地址存储,数据的高位放在高地址存储。

例如代码

#include<stdio.h>
int main()
{
	int a = 0x11223344;

	return 0;
}

我们进入调试查看内存(对于如何查看内存可以点我查看如何查看内存)

我们画成图形来看

 所以可以看到低位在低地址存储所以是小端存储。

对于如何查看电脑是大端存储还是小端存储我们可以写一个代码,代码如下

#include<stdio.h>
int main()
{
	int a = 1;
	char* p = (char*)&a;
	if (*p == 1)
		printf("小端存储\n");
	else
		printf("大端存储\n");
	return 0;
}

 我们运行可以看到

         和我们预想的一样。但是这样的代码为什么可以判断呢?我们知道int类型占用4个字节,char占1个字节,也就是说我们利用一个char*的指针指向int的数据一次修改一个字节,我们可以画图为

 如果这不理解可以查看博客点我查看指针基础

1.2 整形提升

C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

1.2.1整形提升的意义:

        表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长
度。
        通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

1.2.2整形提升规则

整形提升是按照变量的数据类型的符号位来提升的。

1.2.3实例

        例如我们有一个char类型的变量char  a=-1,我们知道char占用1个字节也就是8个比特位故它的二进制序列为111111111.由于我们想进行整形提升得到int类型的a,我们知道整形提升是按照变量的数据类型的符号位来提升的,而符号位是1,int类型占4个字节,32个比特位,故它的二进制序列为111111111111111111111111111111111111。对于正数char类型的变量char b=1,它的二进制序列为00000001,我们对它进行整型提升,它的符号位是0,故我们得到int类型的b的二进制序列为00000000000000000000000000000001。对于unsigned char类型的变量unsigned char c=1,我们对它进行整形提升,和变量一样它的符号位是0(因为它没有符号,也就是说都是正数),故我们得到int类型的c的二进制序列为00000000000000000000000000000001。

2.特定功能

对于特定的功能我们可以想到冒泡排序,我们写一段代码将无序数组变成有序,代码如下

#include<stdio.h>
int main()
{
	int arr[5] = { 8,2,5,6,7 };
	int i, j,max;
	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < 4 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				max = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = max;
			}
		}
	}
	for (i = -0; i < 5; i++)
		printf("%d ", arr[i]);
	return 0;
}

我们运行可以看到

 我们知道冒泡排序的功能就是让无序的数据按照非降序或非升序的方式进行排序。

3.栈区内存销毁导致的错误

        说到栈区内存销毁导致的错误我们有一个很容易错的地方就是我们构造一个函数进行数据交换和在函数中定义数组再返回这个数组的地址

3.1数据交换

数据交换在主函数中基本不会出现错误,但是我们想写一个数据交换的函数我们可能会写成

#include <stdio.h>
void swap(int a, int b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
int main()
{
	int a = 10;
	int b = 20;
	swap(a, b);
	printf("a = %d\nb = %d", a, b);
	return 0;
}

 当我们运行时候我们发现

它的值并没有发生改变,这是因为我们的形参是在栈区开辟的空间,也就是说我们的形参以及temp都是在栈区创建的,它改变的是栈区的数据,不是想要的数据,我们可以画图理解为 

 对于修改我们需要用到指针,代码如下

#include <stdio.h>
void swap(int* a, int* b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
int main()
{
	int a = 10;
	int b = 20;
	swap(&a, &b);
	printf("a = %d\nb = %d", a, b);
	return 0;
}

由于传递的是地址,我们可以理解为

 3.2栈区定义数组

 例如代码

int* madearr()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	int i, j, min;
	for (i = 0; i < 9; i++)
	{
		for (j = 0; j < 9 - i; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				min = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = min;
			}
		}
	}
	return arr;
}

        我们在栈区创建了一个数组我们想要返回数组,但是当函数运行结束后函数所占用的空间会释放,导致数组arr释放,虽然返回了arr但是由于内存的释放返回了一些没有定义的,导致出现错误,想要解决这个问题,只需要我们将数组arr改为全局变量即可

今天我们的内容就结束了,希望大家可以学到很多东西,最后别忘了点赞,评论,收藏哟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/945156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

达梦数据库物化视图介绍

概述 本文将介绍达梦数据库物化视图&#xff0c;给出其概念及相关创建、使用示例。 1.物化视图概念 物化视图 (MATERIALIZED VIEW) 是目标表在特定时间点上的一个副本&#xff0c;占用存储空间&#xff0c;即将查询出来的数据存储在数据库中。当所依赖的一个或多个基表的数据…

Vue 项目性能优化 — 实践指南

前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术&#xff0c;帮我们处理了前端开发中最脏最累的 DOM 操作部分&#xff0c; 我们不再需要去考虑如何操作 DOM 以及如何最高效地操作 DOM&#xff1b;但 Vue 项目中仍然存在项目首屏优化、Webpack 编译配置优化等问题&#xff0c;所…

vs2008下的mfc hello world实现

笔者不知道会写这种博文&#xff0c;好久没写mfc程序&#xff0c;hello world都不会创建了。起因是来了个mfc任务&#xff0c;那就得把mfc熟悉起来&#xff0c;先看下实现效果吧 因为是基于2008的&#xff0c;那就按照2008创建吧 文章目录 第一步&#xff1a;文件新建项目第二…

串口接收数据-控制LED灯

目标 通过串口接收数据&#xff0c;对数据分析&#xff0c;控制8个LED灯按照设定时间闪烁。 8个LED灯可以任意设计&#xff0c;是否闪烁。闪烁时间按ms计算&#xff0c;通过串口发送&#xff0c;可设置1~4,294,967,296ms&#xff0c;也就是4字节数据协议自拟&#xff0c;有数…

(AcWing)Dijkstra求最短路 I

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为正值。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;则输出 −1。 输入格式 第一行包含整数 n 和 m。 接下来 m 行每行包含三个整…

06:流与并发

一般来说&#xff0c;在CUDA C编程中有两个级别的并发&#xff1a; &#xff08;1&#xff09;内核级并发 单一的内核被GPU的多个线程并行执行。 &#xff08;2&#xff09;网格级并发 多个内核在同一设备上同时执行。 一、流和事件概述 CUDA流是一系列异步的CUDA操作&am…

概念解析 | 端边云协同智能计算

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:端边云协同智能计算。 揭秘边缘计算与云计算的完美融合:端边云协同智能计算 物联网学报 | “端—边—云”协同的智慧物联网 在云计算和边缘计算日益发展的背景下,如何将两者…

顺序表链表OJ题(3)——【数据结构】

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 前言&#xff1a; 今天是链表顺序表OJ练习题最后一次分享&#xff0c;每一次的分享题目的难度也再有所提高&#xff0c;但是我相信大家都是非常机智的&#xff0c;希望看到博主文章能学到东西的可以一键三连关注一下博主…

Visual Studio 2022的MFC框架——AfxWinMain全局对象

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Visual Studio 2022下开发工具的MFC框架知识。 当程序调用了CWinApp类的构造函数&#xff0c;并执行了CMfcApp类的构造函数&#xff0c;且产生了theApp 对象之后&#xff0c;接下来就…

Maven入门教程(二):idea/Eclipse使用Maven

Maven入门教程(一)&#xff1a;安装Maven环境 4.开发工具配置 4.1 idea配置 idea有多个版本&#xff0c;配置是一样的&#xff0c;只是配置页面的入口不一样 旧版idea 新版idea 4.2 Eclipse配置 打开Eclipse&#xff0c;菜单中选择&#xff1a;Window -> Preference ->…

Redis项目实战——商户查询缓存

目录 为什么要用Redis实现商户查询缓存&#xff1f;用Redis实现商户查询缓存的基本思路&#xff1f;使用Redis缓存的问题及解决方法&#xff1f;一、如何保持数据库数据和Redis缓存数据的一致性&#xff1f;1 内存淘汰机制2 超时剔除机制3 主动更新机制&#xff08;胜&#xff…

【三进制状态压缩】Gym Plates

Problem - A - Codeforces 题意&#xff1a; 思路&#xff1a; 首先读完题目思路肯定就是状压背包 但是怎么状压 这个和一般的状态压缩不太一样&#xff0c;每个数位的状态有三种&#xff0c;意味着要用三进制的状态压缩 可以这样考虑&#xff1a;99887766554433221100 一…

Flutter:自定义组件的上下左右弹出层

背景 最近要使用Flutter实现一个下拉菜单&#xff0c;需求就是&#xff0c;在当前组件下点击&#xff0c;其下方弹出一个菜单选项&#xff0c;如下图所示&#xff1a; 实现起来&#xff0c;貌似没什么障碍&#xff0c;在Flutter中本身就提供了弹出层PopupMenuButton组件和show…

腾讯云服务器学生怎么买?学生服务器购买指南

腾讯云服务器学生怎么买?学生服务器购买指南&#xff0c;腾讯云学生服务器优惠活动&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.…

什么是光流传感器

传感器 文章目录 传感器前言一、光流传感器二、px4FLOW 前言 光流利用的是图像的变化处理&#xff0c;用于检测地面的状态&#xff0c;从而监测飞机的移动&#xff1b;主要用于保持飞机的水平位置&#xff0c;以及在室内实现定高和定点飞行。 其实光流是数字图像处理理论的一部…

学乐多光屏学习机:教育智能硬件领域的前沿力量

在当今数字化时代&#xff0c;教育方式正经历着巨大的变革&#xff0c;智能硬件为教育领域带来了前所未有的机遇和挑战。学乐多光屏学习机作为一款创新的教育智能硬件产品&#xff0c;以其独特的特点和优势&#xff0c;引领着学习机领域的发展潮流。 1. 多功能融合&#xff1a…

使用MATLAB解算炼油厂的选址

背景 记得有一年的数据建模大赛&#xff0c;试题是炼油厂的选址&#xff0c;最后我们采用MATLAB编写&#xff08;复制&#xff09;蒙特卡洛算法&#xff0c;还到了省级一等奖&#xff0c;这里把仅有一些记忆和材料&#xff0c;放到这里来&#xff0c;用来纪念消失的青春。 本…

Creo结构设计-弧形实体绘制/两个实体的圆滑连接-轨迹扫描

实际需求&#xff1a; 在很多场景需要建模不同弧度的实体对象&#xff0c;常见的依据横截面进行拉伸操作无法很好的完成&#xff0c;有什么样的操作能够方便完成弧形实体建模&#xff1f; 解决方式&#xff1a; 采用轨迹扫描操作完成 举例1&#xff1a;例如两个垂直的圆柱&…

【OpenCV入门】第一部分——图像处理基础

本文结构 图像处理的基本操作读取图像imread() 显示图像imshow()waitKey()destroyAllWindows() 保存图像imwrite() 获取图像属性 像素确定像素的位置获取像素的BGR值修改像素的BGR值 色彩空间GRAY色彩空间cvtColor()——从BGR色彩空间转换到GRAY色彩空间 HSV色彩空间从BGR色彩空…

根据逻辑分析仪实际波形,解析IIC通信及可能出现的问题(从机控制时钟SCL)

1、通信是信息的传递 1.1、信息 信息是多种多样的&#xff0c;在数字电路中&#xff0c;最基本的信息是高低电平&#xff0c;高低电平的提供需要电路转化的&#xff0c;维持高/低是要消耗能量的&#xff0c;信息需要借助能量来存在。 1.2、传递 从发送端传递到接收端需要媒…