铆焊加工平台/扬州seo优化

铆焊加工平台,扬州seo优化,做网站学完html,中国公司排名500强1. sizeof和strlen的对比 1.1 sizeof sizeof 是C语言中的一个操作符&#xff0c;用于计算变量或数据类型所占内存空间的大小&#xff0c;单位是字节。它不关心内存中存储的具体数据内容&#xff0c;只关注内存空间的大小。 #include <stdio.h> int main() {int a 10;…

1. sizeof和strlen的对比

1.1 sizeof

sizeof 是C语言中的一个操作符,用于计算变量或数据类型所占内存空间的大小,单位是字节。它不关心内存中存储的具体数据内容,只关注内存空间的大小。

#include <stdio.h>
int main()
{int a = 10;printf("%d\n", sizeof(a));  // 输出:4(int类型通常占4个字节)printf("%d\n", sizeof a);   // 输出:4(可以省略括号)printf("%d\n", sizeof(int));// 输出:4(计算int类型的大小)return 0;
}

在上面的代码中,sizeof(a) 和 sizeof(int) 都返回4,因为 int 类型通常占用4个字节。

1.2 strlen

strlen 是C语言标准库中的一个函数,用于计算字符串的长度。它的函数原型如下:

size_t strlen(const char *str);

 strlen 从传入的字符串指针开始,向后查找直到遇到 \0 字符为止,统计 \0 之前的字符个数。如果字符串中没有 \0strlen 会继续向后查找,可能导致越界访问。

#include <stdio.h>
#include <string.h>
int main()
{char arr1[3] = {'a', 'b', 'c'};  // 没有\0结尾char arr2[] = "abc";             // 自动添加\0printf("%d\n", strlen(arr1));    // 输出:不确定,arr1没有\0printf("%d\n", strlen(arr2));    // 输出:3printf("%d\n", sizeof(arr1));    // 输出:3printf("%d\n", sizeof(arr2));    // 输出:4(包含\0)return 0;
}

在上面的代码中,strlen(arr1) 的结果是不确定的,因为 arr1 没有以 \0 结尾,strlen 会继续向后查找,直到遇到 \0 为止。而 strlen(arr2) 返回3,因为 arr2 是以 \0 结尾的字符串。

1.3 sizeof和strlen的对比

sizeofstrlen
是操作符是库函数,需包含头文件 <string.h>
计算操作数所占内存的大小,单位是字节计算字符串长度,统计 \0 之前的字符个数
不关心内存中存储的数据内容关注内存中是否有 \0,如果没有 \0 可能会越界

2. 数组和指针笔试题解析

2.1 一维数组

int a[] = {1, 2, 3, 4};
printf("%d\n", sizeof(a));        // 输出:16(4个int,每个4字节)
printf("%d\n", sizeof(a + 0));   // 输出:8(a + 0是首元素地址,指针大小)
printf("%d\n", sizeof(*a));      // 输出:4(*a是首元素,int类型)
printf("%d\n", sizeof(a + 1));   // 输出:8(a + 1是第二个元素的地址,指针大小)
printf("%d\n", sizeof(a[1]));    // 输出:4(a[1]是第二个元素,int类型)
printf("%d\n", sizeof(&a));      // 输出:8(&a是整个数组的地址,指针大小)
printf("%d\n", sizeof(*&a));     // 输出:16(*&a是整个数组,sizeof(a))
printf("%d\n", sizeof(&a + 1));  // 输出:8(&a + 1是跳过整个数组后的地址,指针大小)
printf("%d\n", sizeof(&a[0]));   // 输出:8(&a[0]是首元素地址,指针大小)
printf("%d\n", sizeof(&a[0] + 1));// 输出:8(&a[0] + 1是第二个元素地址,指针大小)

2.2 字符数组

代码块1
char arr[] = {'a', 'b', 'c', 'd', 'e', 'f'};
printf("%d\n", sizeof(arr));      // 输出:6(6个char,每个1字节)
printf("%d\n", sizeof(arr + 0)); // 输出:8(arr + 0是首元素地址,指针大小)
printf("%d\n", sizeof(*arr));    // 输出:1(*arr是首元素,char类型)
printf("%d\n", sizeof(arr[1]));  // 输出:1(arr[1]是第二个元素,char类型)
printf("%d\n", sizeof(&arr));    // 输出:8(&arr是整个数组的地址,指针大小)
printf("%d\n", sizeof(&arr + 1));// 输出:8(&arr + 1是跳过整个数组后的地址,指针大小)
printf("%d\n", sizeof(&arr[0] + 1));// 输出:8(&arr[0] + 1是第二个元素地址,指针大小)
代码块2 
char arr[] = {'a', 'b', 'c', 'd', 'e', 'f'};
printf("%d\n", strlen(arr));      // 输出:不确定,arr没有\0
printf("%d\n", strlen(arr + 0)); // 输出:不确定,arr没有\0
printf("%d\n", strlen(*arr));    // 错误:*arr是char,不是指针
printf("%d\n", strlen(arr[1]));  // 错误:arr[1]是char,不是指针
printf("%d\n", strlen(&arr));    // 输出:不确定,arr没有\0
printf("%d\n", strlen(&arr + 1));// 输出:不确定,&arr + 1指向数组末尾之后
printf("%d\n", strlen(&arr[0] + 1));// 输出:不确定,arr没有\0

代码块3

char arr[] = "abcdef";
printf("%d\n", sizeof(arr));      // 输出:7(包含\0)
printf("%d\n", sizeof(arr + 0)); // 输出:8(arr + 0是首元素地址,指针大小)
printf("%d\n", sizeof(*arr));    // 输出:1(*arr是首元素,char类型)
printf("%d\n", sizeof(arr[1]));  // 输出:1(arr[1]是第二个元素,char类型)
printf("%d\n", sizeof(&arr));    // 输出:8(&arr是整个数组的地址,指针大小)
printf("%d\n", sizeof(&arr + 1));// 输出:8(&arr + 1是跳过整个数组后的地址,指针大小)
printf("%d\n", sizeof(&arr[0] + 1));// 输出:8(&arr[0] + 1是第二个元素地址,指针大小)
代码块4
char arr[] = "abcdef";
printf("%d\n", strlen(arr));      // 输出:6
printf("%d\n", strlen(arr + 0)); // 输出:6
printf("%d\n", strlen(*arr));    // 错误:*arr是char,不是指针
printf("%d\n", strlen(arr[1]));  // 错误:arr[1]是char,不是指针
printf("%d\n", strlen(&arr));    // 输出:6
printf("%d\n", strlen(&arr + 1));// 输出:不确定,&arr + 1指向数组末尾之后
printf("%d\n", strlen(&arr[0] + 1));// 输出:5
代码块5
char *p = "abcdef";
printf("%d\n", sizeof(p));        // 输出:8(p是指针,指针大小)
printf("%d\n", sizeof(p + 1));   // 输出:8(p + 1是指针,指针大小)
printf("%d\n", sizeof(*p));      // 输出:1(*p是char类型)
printf("%d\n", sizeof(p[0]));    // 输出:1(p[0]是char类型)
printf("%d\n", sizeof(&p));      // 输出:8(&p是指针的地址,指针大小)
printf("%d\n", sizeof(&p + 1));  // 输出:8(&p + 1是指针的地址,指针大小)
printf("%d\n", sizeof(&p[0] + 1));// 输出:8(&p[0] + 1是指针,指针大小)
代码块6
char *p = "abcdef";
printf("%d\n", strlen(p));        // 输出:6
printf("%d\n", strlen(p + 1));   // 输出:5
printf("%d\n", strlen(*p));      // 错误:*p是char,不是指针
printf("%d\n", strlen(p[0]));    // 错误:p[0]是char,不是指针
printf("%d\n", strlen(&p));      // 错误:&p是指针的地址,不是字符串
printf("%d\n", strlen(&p + 1));  // 错误:&p + 1是指针的地址,不是字符串
printf("%d\n", strlen(&p[0] + 1));// 输出:5

 2.3 二维数组

int a[3][4] = {0};
printf("%d\n", sizeof(a));        // 输出:48(3行4列,每个int占4字节)
printf("%d\n", sizeof(a[0][0])); // 输出:4(a[0][0]是int类型)
printf("%d\n", sizeof(a[0]));    // 输出:16(a[0]是第一行数组,4个int)
printf("%d\n", sizeof(a[0] + 1));// 输出:8(a[0] + 1是第二行首元素地址,指针大小)
printf("%d\n", sizeof(*(a[0] + 1)));// 输出:4(*(a[0] + 1)是第二行首元素,int类型)
printf("%d\n", sizeof(a + 1));   // 输出:8(a + 1是第二行地址,指针大小)
printf("%d\n", sizeof(*(a + 1)));// 输出:16(*(a + 1)是第二行数组,4个int)
printf("%d\n", sizeof(&a[0] + 1));// 输出:8(&a[0] + 1是第二行地址,指针大小)
printf("%d\n", sizeof(*(&a[0] + 1)));// 输出:16(*(&a[0] + 1)是第二行数组,4个int)
printf("%d\n", sizeof(*a));      // 输出:16(*a是第一行数组,4个int)
printf("%d\n", sizeof(a[3]));    // 输出:16(a[3]是第四行数组,4个int)

3. 指针运算笔试题解析

3.1  题目1

#include <stdio.h>
int main()
{int a[5] = {1, 2, 3, 4, 5};int *ptr = (int *)(&a + 1);printf("%d,%d", *(a + 1), *(ptr - 1));  // 输出:2,5return 0;
}

  • *(a + 1)a 是数组首元素地址,a + 1 是第二个元素地址,*(a + 1) 是2。

  • *(ptr - 1)ptr 指向数组末尾之后,ptr - 1 是最后一个元素地址,*(ptr - 1) 是5。

 3.2 题目2

#include <stdio.h>
struct Test
{int Num;char *pcName;short sDate;char cha[2];short sBa[4];
} *p = (struct Test *)0x100000;
int main()
{printf("%p\n", p + 0x1);              // 输出:0x100014(结构体大小20字节)printf("%p\n", (unsigned long)p + 0x1);// 输出:0x100001(unsigned long类型加1)printf("%p\n", (unsigned int *)p + 0x1);// 输出:0x100004(unsigned int*类型加1)return 0;
}
  • p + 0x1p 是结构体指针,结构体大小为20字节,p + 1 是 0x100000 + 20 = 0x100014

  • (unsigned long)p + 0x1p 被强制转换为 unsigned long,加1后为 0x100001

  • (unsigned int *)p + 0x1p 被强制转换为 unsigned int*,加1后为 0x100004

 3.3 题目3

#include <stdio.h>
int main()
{int a[3][2] = {(0, 1), (2, 3), (4, 5)};int *p;p = a[0];printf("%d", p[0]);  // 输出:1return 0;
}

  • a[3][2] 的初始化使用了逗号表达式,实际初始化为 {1, 3, 5}

  • p = a[0]p[0] 是 a[0][0],值为1。

 3.4 题目4

#include <stdio.h>
int main()
{int a[5][5];int(*p)[4];p = a;printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);  // 输出:FFFFFFFC,-4return 0;
}

  • p 是指向 int[4] 的指针,p[4][2] 相当于 *(*(p + 4) + 2)

  • &p[4][2] - &a[4][2] 计算的是两个指针之间的元素个数差,结果为-4

 3.5 题目5

#include <stdio.h>
int main()
{int aa[2][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int *ptr1 = (int *)(&aa + 1);int *ptr2 = (int *)(*(aa + 1));printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));  // 输出:10,5return 0;
}
  • (ptr1 - 1)ptr1 指向数组末尾之后,ptr1 - 1 是最后一个元素,值为10。

  • *(ptr2 - 1)ptr2 指向第二行首元素,ptr2 - 1 是第一行最后一个元素,值为5。

 3.6 题目6

#include <stdio.h>
int main()
{char *a[] = {"work", "at", "alibaba"};char **pa = a;pa++;printf("%s\n", *pa);  // 输出:atreturn 0;
}
  • pa 是指向 a[0] 的指针,pa++ 后指向 a[1]*pa 是 "at"

 3.7 题目7

#include <stdio.h>
int main()
{char *c[] = {"ENTER", "NEW", "POINT", "FIRST"};char **cp[] = {c + 3, c + 2, c + 1, c};char ***cpp = cp;printf("%s\n", **++cpp);  // 输出:POINTprintf("%s\n", *--*++cpp + 3);  // 输出:ERprintf("%s\n", *cpp[-2] + 3);  // 输出:STprintf("%s\n", cpp[-1][-1] + 1);  // 输出:EWreturn 0;
}
  • **++cppcpp 指向 cp[1]*cpp 是 c + 2**cpp 是 "POINT"

  • *--*++cpp + 3cpp 指向 cp[2]*cpp 是 c + 1--*cpp 是 c*--*cpp 是 "ENTER"+3 后是 "ER"

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

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

相关文章

deepseek+mermaid【自动生成流程图】

成果&#xff1a; 第一步打开deepseek官网(或百度版&#xff08;更快一点&#xff09;)&#xff1a; 百度AI搜索 - 办公学习一站解决 第二步&#xff0c;生成对应的Mermaid流程图&#xff1a; 丢给deepseek代码&#xff0c;或题目要求 生成mermaid代码 第三步将代码复制到me…

Solon AI —— RAG

说明 当前大模型与外部打交道的方式有两种&#xff0c;一种是 Prompt&#xff0c;一种是 Fuction Call。在 Prompt 方面&#xff0c;应用系统可以通过 Prompt 模版和补充上下文的方式&#xff0c;调整用户输入的提示语&#xff0c;使得大模型生成的回答更加准确。 RAG RAG &…

STM32——USART—串口发送

目录 一&#xff1a;USART简介 二&#xff1a;初始化USART 1.开启时钟 2.代码 三&#xff1a;USART发送数据 1.USART发送数据函数 2.获取标志位的状态 3.代码 4.在main.c内调用 5.串口调试 1.串口选择要与设备管理器中的端口保持一致 2.波特率、停止位等要与前面…

基于SpringBoot的在线骑行网站的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

通义万相2.1:开启视频生成新时代

文章摘要&#xff1a;通义万相 2.1 是一款在人工智能视频生成领域具有里程碑意义的工具&#xff0c;它通过核心技术的升级和创新&#xff0c;为创作者提供了更强大、更智能的创作能力。本文详细介绍了通义万相 2.1 的背景、核心技术、功能特性、性能评测、用户反馈以及应用场景…

3.3.2 Proteus第一个仿真图

文章目录 文章介绍0 效果图1 新建“点灯”项目2 添加元器件3 元器件布局接线4 补充 文章介绍 本文介绍&#xff1a;使用Proteus仿真软件画第一个仿真图 0 效果图 1 新建“点灯”项目 修改项目名称和路径&#xff0c;之后一直点“下一步”直到完成 2 添加元器件 点击元…

极狐GitLab 正式发布安全版本17.9.1、17.8.4、17.7.6

本分分享极狐GitLab 补丁版本 17.9.1、17.8.4、17.7.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码&#xff0c;我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS&#xff0c;技术团队已经进行了升级&#xff0c;无需用户采取任何…

QT——对象树

在上一篇博客我们已经学会了QT的坏境安装以及打印一个hello world&#xff0c;但是如果有细心的朋友看了代码&#xff0c;就会发现有一个严重的问题&#xff0c;从C语法看来存在内存泄漏。 上面的代码实际上并没有发送内存泄漏&#xff0c;是不是觉得有点奇怪&#xff1f;大家有…

深度学习之-“深入理解梯度下降”

梯度下降是机器学习和深度学习的核心优化算法&#xff0c;几乎所有的模型训练都离不开它。然而&#xff0c;梯度下降并不是一个单一的算法&#xff0c;而是一个庞大的家族&#xff0c;包含了许多变体和改进方法。本文将从最基础的梯度下降开始&#xff0c;逐步深入学习&#xf…

力扣-字符串

字符串不能被修改&#xff0c;所以如果有想修改字符串的行为&#xff0c;需要转换为StringBuilder StringBuilder里也有很多封装方法String没有&#xff0c;比如reverse() StringBuilder sb new StringBuilder();// 添加字符串 sb.append("Hello"); sb.append(&qu…

Ollama+Deepseek-R1+Continue本地集成VScode

一、OllamaDeepseek-R1Continue本地集成VScode 1&#xff09;安装前知识点 Continue 介绍 详情可参照官网&#xff1a; continue官网 Continue 是 Visual Studio Code 和 JetBrains 中领先的开源 AI 代码助手。 •在侧边栏中进行聊天以理解和迭代代码。 •自动补全&#…

风虎云龙R87与RH87八卡服务器震撼首发

在科技迅猛发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;领域正以前所未有的速度改变着世界。从内容创作的智能化&#xff0c;到智能客服的广泛应用&#xff0c;AI技术已经深入到我们生活的方方面面。而这一切的背后&#xff0c;都离不开高性能算力设备的强大支撑…

18.分布式任务调度

固定的时间点去执行固定的任务&#xff0c;这就是任务调度。

Element UI-Select选择器结合树形控件终极版

Element UI Select选择器控件结合树形控件实现单选和多选&#xff0c;并且通过v-model的方式实现节点的双向绑定&#xff0c;封装成vue组件&#xff0c;文件名为electricity-meter-tree.vue&#xff0c;其代码如下&#xff1a; <template><div><el-select:valu…

系统盘还原成正常U盘

选择格式化,等格式化完毕就完了 点击还原设备的默认值格式化就完了

Linux系统下安装配置 Nginx 超详细图文教程_linux安装nginx

#安装当前路径下所有安装包 rpm -Uvh *.rpm --nodeps --force2.2、安装Nginx 找到Nginx的安装包进行解压 #解压安装包 tar -zxvf nginx-1.24.0.tar.gz进入解压之后的nginx目录下&#xff1a; #进入nginx目录 cd /usr/local/nginx-1.24.0执行配置脚本&#xff0c;–prefix是指…

如何排查服务器内存泄漏问题

服务器内存泄漏是一种常见的问题&#xff0c;可能导致系统性能下降甚至系统崩溃。以下是一般情况下用于排查服务器内存泄漏问题的步骤&#xff1a; 排查服务器内存泄漏问题的步骤&#xff1a; 监控系统资源&#xff1a; 使用系统监控工具&#xff08;如top、htop、free&#x…

山东大学计算机科学与技术学院软件工程实验日志

--- Author: "Inori_333" Date: 2025-03-04 --- 实验一 团队建立、阅读开源软件 1.队伍创建与分工 队伍最终确定由5人组成&#xff0c;小组成员之间进行了高效的沟通&#xff0c;并确定了各自的负责的部分内容。 2.代码复现与分析 写在前面&#xff1a;由于“…

mybatis映射文件相关的知识点总结

mybatis映射文件相关的知识点总结 mybatis官网地址 英文版&#xff1a;https://mybatis.org/mybatis-3/index.html 中文版&#xff1a;https://mybatis.p2hp.com/ 搭建环境 /* SQLyog Ultimate v10.00 Beta1 MySQL - 8.0.30 : Database - mybatis-label *****************…

SQLAlchemy系列教程:SQLAlchemy快速入门示例项目

SQLAlchemy是与数据库交互的Python开发人员不可或缺的库。这个强大的ORM允许使用python结构进行简单的数据库操作。设置过程很简单&#xff0c;并且允许可扩展的数据库应用程序开发。本文通过入门项目完整介绍SQLAlchemy的应用过程&#xff0c;包括安装依赖包&#xff0c;创建连…