C语言初阶学习笔记

这篇具有很好参考价值的文章主要介绍了C语言初阶学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人主页:点我进入主页

专栏分类: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;
}

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

C语言初阶学习笔记,# C语言初阶,c语言,学习,笔记

我们画成图形来看

C语言初阶学习笔记,# C语言初阶,c语言,学习,笔记

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

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

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

 我们运行可以看到

C语言初阶学习笔记,# C语言初阶,c语言,学习,笔记

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

C语言初阶学习笔记,# C语言初阶,c语言,学习,笔记

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

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;
}

我们运行可以看到

C语言初阶学习笔记,# C语言初阶,c语言,学习,笔记

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

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;
}

 当我们运行时候我们发现

C语言初阶学习笔记,# C语言初阶,c语言,学习,笔记

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

C语言初阶学习笔记,# C语言初阶,c语言,学习,笔记

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

#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;
}

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

C语言初阶学习笔记,# C语言初阶,c语言,学习,笔记

 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改为全局变量即可

今天我们的内容就结束了,希望大家可以学到很多东西,最后别忘了点赞,评论,收藏哟。文章来源地址https://www.toymoban.com/news/detail-685881.html

到了这里,关于C语言初阶学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言初阶(八)】初阶指针详解

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 我们在介绍C语言时已经给大家介绍过指针的概念以及内存地址的概念了,这里我们就不再重复说明前面的内容,对指针毫无了解的

    2024年02月09日
    浏览(45)
  • 【初阶C语言】初阶结构体详细讲解

    结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 例如描述一个学生: 结构的成员可以是标量、数组、指针,甚至是其他结构体。 有了结构体类型,那如何定义变量,其实很简单。 结构体变量访问成员 结构变量的成员是通过点操作符(

    2023年04月12日
    浏览(36)
  • C语言学习笔记——C语言结构

    C语言是一种面向过程的结构化的语言,同时具有高级语言和汇编语言的优点 所有的C语言程序经过编译和连接之后才能被计算机执行 头文件是一种特殊的文件,记录了很多可以直接引用头文件然后使用的函数,也可通过#define声明函数、变量、宏等的定义 头文件通常包含在源

    2024年02月11日
    浏览(43)
  • C语言(学习笔记)

    (1) 文件名: xxx.c (2) 引用: #include stdio.h (3) 常量: #define SIZE 5 (4) 全局变量: int i = 1; (5) 函数: void main() {... } (6) 注释: // 单行注释,  /* 多行注释 */ (7) 局部变量:声明( int a ;  char b[]=\\\"abc\\\" ;  double c,d,e ;) 赋值( a=2 ;) (8) 输入: scanf (\\\"%d\\\", a); (9) 输出: printf (\\\"%d\\\", a); 注

    2024年02月19日
    浏览(32)
  • 语言认知模型--的学习笔记

    认知语言学:认知科学(cognitive science)与语言学交 叉的一个研究分支,是研究人脑的思维、心智、智能、推理和认识等认知机理及其对语言进 行分析和理解过程的一门学问 语言认知计算模型: 刻画人脑语言认知和理解过程的形式化模型 目的:建立可计算的、复杂度可控的

    2024年02月10日
    浏览(37)
  • 汇编语言学习笔记四

    字符是以ASCII码的形式存储的,一个字符对应着8为二进制数,2位16进制数。 所以可以得到对应的字符地址。 根据ASCII码,字符的大写和小写相差一个0010 0000,比如a对应的ASCII码是0110 0001,那么A则对应的是0100 0001,对比可以发现他们只是第5位不同,第5位为1,则是小写,否则

    2024年02月03日
    浏览(59)
  • Go语言学习笔记

    注:安装教程 注:上一篇笔记 注:下一篇笔记 2.6、流程控制 2.6.1、条件语句 2.6.2、选择语句 2.6.3、循环语句 2.6.4、跳转语句 goto语句跳转到本函数内的某个标签 2.7、函数 2.7.1、函数定义 函数构成代码执行的逻辑结构。函数的基本组成为:func、函数名、参数列表、返回值

    2024年02月06日
    浏览(45)
  • 汇编语言学习笔记六

    CF:进位标志位,产生进位CF=1,否则为0 PF:奇偶位,如010101b,则该数的1有3个,则PF=0,如果该数的1的个数为偶数,则PF=1。 0也是偶数 ZF:在相关指令执行后(运算和逻辑指令,传送指令不影响ZF的值),其结果为0,则ZF=1,否则为0。 SF:符号标志位,如果结果为负,则SF=1,否则为

    2024年02月03日
    浏览(41)
  • 【go语言学习笔记】05 Go 语言实战

    在做项目开发的时候,要善于借助已经有的轮子,让自己的开发更有效率,也更容易实现。 1. RESTful API 定义 RESTful API 是一套规范,它可以规范如何对服务器上的资源进行操作。和 RESTful API 和密不可分的是 HTTP Method。 1.1 HTTP Method HTTP Method最常见的就是POST和GET,其实最早在

    2024年02月13日
    浏览(44)
  • 6.Go语言学习笔记-结合chatGPT辅助学习Go语言底层原理

    1、Go版本 2、汇编基础 推荐阅读:GO汇编语言简介 推荐阅读:A Quick Guide to Go\\\'s Assembler - The Go Programming Language 精简指令集 数据传输: MOV/LEA 跳转指令: CMP/TEST/JMP/JCC 栈指令: PUSH/POP 函数调用指令: CALL/RET 算术指令: ADD/SUB/MUL/DIV 逻辑指令: AND/OR/XOR/NOT 移位指令: SHL/SHR JCC有条件跳转: JE

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包