【C语言】C语言零碎知识点

2023-11-20


需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。


 目录

1、sizeof和strlen

​2、函数形参(很重要)

​2.1传值调用

​2.2传址调用

​3、函数的嵌套调用和链式访问

​3.1函数的嵌套调用

​3.2函数的链式访问

​4、隐式类型转换

​4.1整型提升

整型提升的方式

整型提升的例子

​4.2算术转换

​5、野指针

​5.1野指针的成因

1、指针未初始化

2、指针越界

3、指针指向的空间销毁/释放

​5.2如何规避野指针

​6、const

​7、写一个函数返回参数二进制中 1 的个数。

​7.1除2法

​7.2使用n &(1<)<>

​7.3使用n = n & (n - 1)

​8、数组在内存中的存储


各位朋友大家好呀!在学c语言的时候,总会遇到些零碎的知识点或者名词,每个知识点单独水一篇脸上挂不住,所以缝合成一篇发布了,赶紧来查漏补缺吧。

c3d9868730067527dec42f67d83af642.gif1、sizeof和strlen

sizeof是关键字,以数组为例,'\0'也会被计算,所以不要管数组里边放了什么数据,直接数元素个数即可,再乘数据类型大小,单位是字节。

strlen是库函数,遇到'\0'就停止,不计算'\0'。

#include <stdio.h>
#include <string.h>
int main()
{
    char arr[] = "abcdef";
    printf("%zu %zu", sizeof(arr), strlen(arr));//输出7和6。
    return 0;
}

6d722a66eee5ccad55e7b517a714757d.gif2、函数形参(很重要)

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

77ca0ad84d3766ab20fa4bc2557a87bd.gif2.1传值调用

传值调用时,形参是实参的一份临时拷贝,形参的改变不会改变实参。

65bd0976fcd0b476a4a1b7979f6116dc.gif2.2传址调用

可以通过传入实参的地址,在函数内部操纵实参。

传址调用的总结:先明确想要修改的值是什么类型,设定的形参类型需要比修改类型多一颗*哦!

举例:

1、冒泡排序函数需要通过修改数组内的元素,从而达到排序的目的。那么我们需要传入一级指针。

2、无头单链表的头插,需要改变单链表的头指针,所以要传入二级指针。

29aa5123ad46328e7a61a5a143708045.gif3、函数的嵌套调用和链式访问

b66c197ac4eb2c592b59723747dcc670.gif3.1函数的嵌套调用

函数里边调用函数。

55ce246120cad9db5a0ae1ce1ecf0db9.gif3.2函数的链式访问

把一个函数的返回值作为另外一个函数的参数。

5acdb68989b1b529b1418e241a8bbf0e.gif4、隐式类型转换

隐式转换指的是不需要用户干预,编译器私下进行的类型转换行为。很多时候用户可能都不知道发生了哪些转换。

2be8ebd81cbe16601701c68781eaab3e.gif4.1整型提升

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。

所以char和short类型在运算时,会先转换为int或unsigned int参与运算,运算完成后将多余的二进制位截断,重新储存至原类型内。

整型提升的方式

1、有符号数据类型高位补符号位

2、无符号数据类型高位补0

整型提升的例子

先来看一段代码

当程序运行到char c=a+b时,将会发生整型提升。

125在内存中的补码是01111101

5在内存中的补码是00000101

整型提升后125和5的补码分别是:

00000000000000000000000001111101

00000000000000000000000000000101

相加所得c的补码:

00000000000000000000000010000010
把c截断的补码:

10000010

以%d的形式打印c,再次发生整型提升得到c的补码:

11111111111111111111111110000010

c的原码:

10000000000000000000000001111110(-126)

b66c197ac4eb2c592b59723747dcc670.gif 4.2算术转换

两个不同类型的操作数在运算时,排名较低的类型将被转换为排名较高的数据类型。以下是数据类型的排名。

long double
double
float
unsigned long int
long int
unsigned int
int

注意:若将排名较高的数据类型转换为排名较低的数据类型,将会丢失精度。

float f = 3.14;
int num = f;//隐式转换,会有精度丢失

f2aa035dda1d6baf08bbde31c00dfa59.gif5、野指针

野指针:指针指向的位置是不可知的。

9e271ef533c4e40790e86179d1d00c72.gif5.1野指针的成因

1、指针未初始化

#include <stdio.h>
int main()
{ 
 int *p;//局部变量指针未初始化,默认为随机值
    *p = 20;
 return 0; 
}

2、指针越界

#include <stdio.h>
int main()
{
    int arr[10] = { 0 };
    int* p = arr;
    for (int i = 0;i < 12;i++)
    {
        *(p++) = i;//程序报错
    }
    return 0;
}

3、指针指向的空间销毁/释放

#include <stdio.h>
int* test()
{
	int a = 10;
	return &a;
}
int main()
{
	int*p = test();//由于a在出了函数范围即被销毁,可以认为此时p是野指针
	if (p != NULL)
	{
		printf("%d\n", *p);//
	}
	return 0;
}

动态内存管理中,需要将堆区的指针及时置空(后续文章进行讲解)

9b88c98924d96f6e5f1ac5b67512a845.gif5.2如何规避野指针

1. 指针初始化
2. 小心指针越界
3. 指针指向空间释放即使置 NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性

5e90ab0d2d9606fc9a5d37568a20a0be.gif6、const

const int* p=arr[10];//保护arr不被修改(可用下一级指针进行更改)
int* const p=arr[10];//保护指针p不被修改(可用下一级指针进行更改)
const int* const p=arr[10];//保护指针p和数组都不可被修改(可用下一级指针进行更改)

2cb5fd41d45e6fcc27718aa623c50eb5.gif7、写一个函数返回参数二进制中 1 的个数。

09e8372bd1d2f8f4f7223dd99b9740b7.gif7.1除2法

int count_num_of_1(unsigned int n)
{
	int count = 0;
	while (n)
	{
		if ((n % 2) == 1)
		{
			count++;
		}
		n /= 2;
	}
	return count;
}

注意形参必须是unsigned整型,可以兼顾正负数的二进制位1的统计。

3e5a3a720647b974ad90902f7843456d.gif7.2使用n &(1<<i)

int count_num_of_1(int n)
{
	int i = 0;
	int count = 0;
	for (i = 0; i < 32; i++)
	{
		if ((n &(1<<i)) != 0)
		{
			count++;
		}
	}
	return count;
}

让1的二进制位分别左移0-31位后与n按位与,即可得到n的二进制位的1的个数。左移较右移的优点:不用考虑当前编译器是算术右移还是逻辑右移。

a9ae404f79a220cd5ca1731011dc51ef.gif7.3使用n = n & (n - 1)

int count_num_of_1(int n)
{
	int count = 0;
	while (n)
	{
		n = n & (n - 1);
		count++;
	}
	return count;
}

让n与n-1按位与,计算出n的二进制位的个数。类似抽丝剥茧,把n的二进制位上的1,从低位到高位,层层统计出来。

2cb5fd41d45e6fcc27718aa623c50eb5.gif8、数组在内存中的存储

随着数组下标的增长,数组地址是由低到高变化的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C语言】C语言零碎知识点 的相关文章

随机推荐

  • 【自用】无法通过ESP32创建HomeAssistant实体问题解决(MQTT对ESP32创建实体请求无应答)

    一 问题描述 1 使用 MQTTX 测试客户端能够创建实体 当通过 MQTTX 发送注册实体请求的时候 实体能够在 MQTT 服务器中注册成功 2 使用 ESP32 无法创建实体 在ESP32中通过 publish 函数发送注册请求的时候
  • 数据库不推荐使用外键的9个理由!

    我的经验告诉我 很多数据库 大多数我曾经使用的 不包含外键时并不总是一件坏事 在这篇文章中 我想把重点放在为什么的原因上 为什么这是一个问题 1 潜在的数据完整性问题 缺少外键明显问题是数据库不能强制进行引用完整性检查 如果在高一层没有正确
  • 用指针访问一维数组

    文章目录 顺序查找 数组方式实现 指针实现方式 对一位数组元素的访问有三种方式 指针变量的关系运算 引例 数组实现方式 主函数 指针实现方式 主函数 一维数组作为函数的参数 实际应用 顺序查找 要求用指针实现 在整数集合r中顺序查找与给定值
  • linux下安装redis数据库

    上一篇文章写到安装虚拟机 接下来就可以使用我们的虚拟机了 redis的安装 首先我们下载好需要的安装包 可以进入官网 https redis io download 不挑版本的直接用我分享的redis 6 2 6 tar gz 链接 htt
  • .vimrc配置

    set 前加冒号 与不加 一样 set nu 状态栏 let mapleader
  • Xmind8 Pro安装教程(Win+Mac)

    原文http blog csdn net anzhongliu article details 78081267 转自 https blog csdn net u014172271 article details 79666848 xmin
  • 网络安全工程师教你:Shadon网络空间搜索引擎使用教程

    一 背景介绍 与谷歌不同的是 Shodan不是在网上搜索网址 而是直接进入互联网的背后通道 Shodan可以说是一款 黑暗 谷歌 一刻不停的在寻找着所有和互联网关联的服务器 摄像头 打印机 路由器等等 每个月Shodan都会在大约5亿个服务
  • Linux--shell之while循环+for循环+until循环

    Linux shell之while循环 for循环 until循环 概述 for循环 while循环 until循环 循环嵌套 概述 脚本执行任务的时候总会遇到需要重复执行的时候 为了节省资源 除了计划任务 我们还可以使用脚本来完成 接下来
  • 数据分析库的拓展学习

    01 前言 除了前文所说的python数据分析的 三大神器 之外 你还需要对数据进行进一步的建模 预测 评估 并进行数据可视化 想要一劳永逸 就需要坚持学习一些更好用的数据分析库 接下来就逐一介绍 02 衍生库的使用 Seaborn Sea
  • 前端框架之Vue学习(二)

    一 事件修饰符 enter 回车生效 常用于替代判断是否按下回车事件 once 单次生效 只会生效一次 stop 阻止事件冒泡 self 阻止事件冒泡 只有点击自身时才生效 capture 将后面的事件变为捕获事件 prevent 阻止默认
  • Camunda工作流网关(二)-Parallel Gateway(并行网关)

    目录 1 Parallel Gateway 并行网关 2 业务场景 3 BPMN流程模型文件 在Camunda的 Modeler工具中提供了5种类型的网关 Exclusive Gateway 独占网关或排他网关 Parallel Gatew
  • [SUCTF 2019]EasyWeb

    SUCTF 2019 EasyWeb 打开环境是一段代码 其中if preg match x00 0 9A Za z x7F i hhh 这个判断是难点 它的绕过可以参考这篇文章https www h3399 cn 201909 72364
  • 接口自动化测试学习指南(2023版)

    一 为什么要学习接口自动化测试 1 1 了解接口自动化测试的重要性 提高效率与速度 持续集成与持续交付 准确性与一致性 更广泛的覆盖范围 持久回归测试 节省成本与资源 早期发现问题 提升团队信心 可重复与可维护性 支持多平台与多环境 1 2
  • python离线语音转文字

    1 安装SpeechRecognition第三方库 pip install SpeechRecognition 2 安装pocketsphinx第三方库 安装时 可能会报错error command swig exe failed No s
  • 多益网络笔试

    一笔 2017 05 19 基本上考的是写概率题和智力题 没来得及整理就忘得差不多 最后一个题是个推理题 二笔 2017 05 25 单选 C 的基础知识 二叉树结点计算 填空 类的操作 结构体 联合体的大小计算 简答 1 如何理解虚析构
  • Excel VBA获取最后一行列

    测试excel文件 VBA代码 Function getLastRow Debug Print End xlUp Sheets 1 A65536 End xlUp Row Debug Print usedRange ActiveSheet
  • Linux操作文档——FTP文件传输服务

    文章目录 一 基本概念 1 FTP连接及传输模式 2 用户列表文件ftpusers和user list 二 基于系统用户的FTP服务 1 匿名访问的FTP服务 2 用户验证的FTP服务 三 基于虚拟用户的FTP服务 1 建立虚拟用户的账号数
  • 网站页面导入css,图片等文件的相对路径和绝对路径问题

    相对路径 表示上一级目录开始 表示当前同级目录开始 相对 肯定是个参考对象 很多人可能会认为这个参考对象就是导入css或图片等的页面 但其实对于网站访问而言 这个对象是参考你所访问的url地址的 因为最近在写thinkphp 相对的话对于t
  • Angular6以ng serve方式启动时指定环境方法及关联知识点

    一 踩坑 1 问题来源 如何自定义环境并在启动时指定环境 2 解决方案 使用configuration参数启动项目 如ng serve configuration local or ng serve c local启动名为local的环境
  • 【C语言】C语言零碎知识点

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 1 sizeof和strlen 2 函数形参 很重要 2