c语言查漏补缺

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

例子一

#include<iostream>
using namespace std;

int main()
{
    int a[5]={1,2,3,4,5};
    int* ptr = (int*)(a+1);
    printf("%d",*(ptr-1));
    return 0;
}

输出结果是:1,这个很好理解,数组名即数组的首地址,(a+1)等价于a[1],然后取ptr-1的值,则是a[0]

例子二

#include<iostream>
using namespace std;

int main()
{
    int a[5]={1,2,3,4,5};
    int* ptr = (int*)(&a+1);
    printf("%d",*(ptr-1));
    return 0;
}

输出结果是:5,这个我有点疑惑,经过研究,原因是这样的:
将数组 a 的地址加上 1,这会使指针 ptr 指向数组 a 的末尾之后的位置。因为数组 a 的类型是 int[5],所以 (&a+1) 指向的是整个数组 a 之后的位置,即指向的是一个越界的内存地址(未定义行为)。
接着,将指针 ptr 指向的地址减去 1,即指向数组 a 的最后一个元素的地址。最后,通过解引用指针 ptr-1 来访问该地址的值,即 5。

例子三

5、定义int a[8];问下面哪些不可以表示a[1]的地址

1、(int*)(&a+1) //相当于a[last]+1

2、(int*)( (char*) &a+sizeof (int))

3、&a[0]+1 //a[1]

4、a+sizeof (int) //a[4]

答案:1和4

四个选项中,第2个我不理解,经过研究,原理是:
把&a被强制转换成char类型的指针,即指向一个字节的地址,即指向第一个元素的首地址,往下偏移4个单位(一个int,4个单位),就是a[1]的起始地址,再把这个指针强制转换成int类型,就是完全指向a[1]的指针,所以这个也是a[1]的地址。
谨记:指针即地址,题目可解

c语言查漏补缺
(char*)&a指向的位置是①,
(char*)&a+4指向的是②

例子四

#include <iostream>

using namespace std;

int main() {

    int a =5;

    float b;

    cout<<sizeof(++a + b)<<' ';//4
    cout << a;//5

    return 0;

}

答案是4 5,sizeof(++a + b)是4能理解,相当于转换成sizeof(int)了,但是,为什么a还是5?a不是自加了吗?

于是,进行了如下实验:

#include <iostream>

using namespace std;

int main() {

    int a =5;
    cout << a<<' ';
    cout<<sizeof(++a)<<' ';
    cout << a<<' ';
    ++a;
    cout << a<<' ';

    return 0;

}

答案是: 5 4 5 6 ,这说明sizeof比较特殊,在sizeof()这个运算符中自加不算数

补充:sizeof 接受的参数可以是对象也可以是表达式,但是 sizeof(expression) 在运行时不会对接受的表达式进行计算,编译器只会推导表达式的类型从而计算占用的字节大小;而 strlen 是一个函数,如果接受表达式则会对表达式进行运算
strlen 本身是库函数,因此在程序运行过程中,计算长度;而 sizeof 是在编译时计算长度;sizeof 的参数可以是类型,也可以是变量,且必须是完整类型;strlen 的参数必须是 char * 类型的变量。
strlen 是头文件 <cstring> 中的函数,sizeof 是 C++ 中的运算符。strlen 测量的是字符串的实际长度,以 \0 结束;而 sizeof 测量的是对象或者表达式类型占用的字节大小。文章来源地址https://www.toymoban.com/news/detail-508302.html

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

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

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

相关文章

  • golang 编程规范查漏补缺

    公司最近出了 golang 语言规范,大部分参考 uber 的 go 语言规范(原版和翻译),以及官方的 Effective Go。这里分享一下自己之前没注意的点,查漏补缺 defer 和返回值赋值的执行顺序 对应知识点为方法返回值是有名还是无名的时候,defer 的顺序的差异 defer 和返回值之间的关系

    2024年02月07日
    浏览(39)
  • C++新经典 | C++ 查漏补缺(智能指针)

    目录 一、动态分配 1.初始化的三种方式 2. 释放内存 (1)悬空指针  3.创建新工程与观察内存泄漏 二、深入了解new/delete 1.new和delete 2.operator new()和operator delete() 3.申请和释放一个数组 三、智能指针  1.shared_ptr (1)常规初始化 (2)make_shared (3)引用计数 (3.1)引用计

    2024年02月07日
    浏览(25)
  • Android SystemUI 信号栏后添加信号图标,查漏补缺

    android:layout_width=“wrap_content” android:layout_marginStart=“1dp” android:visibility=“gone” android:tag=“mobile_slot_indicator_4” /      ImageView android:id=“@+id/custom_signal_4g” android:layout_height=“wrap_content” android:layout_width=“wrap_content” android:visibility=“gone” android:background=“@drawable/stat_sys

    2024年03月26日
    浏览(36)
  • 5种常用Web安全扫描工具,快来查漏补缺吧!

    漏洞扫描是一种安全检测行为,更是一类重要的网络安全技术,它能够有效提高网络的安全性,而且漏洞扫描属于主动的防范措施,可以很好地避免黑客攻击行为,做到防患于未然。那么好用的漏洞扫描工具有哪些? 答案就在本文! 1、AWVS Acunetix Web Vulnerability Scanner(简称

    2024年02月08日
    浏览(29)
  • 引入头文件#include <iostream>的时候发生了什么?

    cin extern istream cin; The object controls extractions from the standard input as a byte stream. Once the object is constructed, the call cin.tie() returns cout. cout extern ostream cout; The object controls insertions to the standard output as a byte stream. /@@/ 帮助文档 ios_base::fmtflags typedef T1 fmtflags; static const fmtflags boolalpha, dec, fix

    2024年02月16日
    浏览(27)
  • Android-高级-UI-进阶之路-(二)-深入理解-Android-8-0-View-触摸事件分发机制,查漏补缺

    我们看到内部又调用了父类 dispatchTouchEvent 方法, 所以最终是交给 ViewGroup 顶级 View 来处理分发了。 顶级 View 对点击事件的分发过程 在上一小节中我们知道了一个事件的传递流程,这里我们就大致在回顾一下。首先点击事件到达顶级 ViewGroup 之后,会调用自身的 dispatchTouchE

    2024年04月14日
    浏览(58)
  • c++命名空间和include C++ #include<string> 和 using std::string

    1、C++中的命名空间namespace_51CTO博客_c++中的命名空间   2、 C++ #includestring 和 using std::string_yang20141109的博客-CSDN博客 //不光要加头文件,和C语言不同 #include utils/Errors.h //还要加using using android::status_t; using android::INVALID_OPERATION; using android::NO_ERROR; using android::BAD_VALUE; 3、c和c++的差

    2023年04月20日
    浏览(38)
  • c++命名空间和include C++ #include<string> 和 using std::string

    1、C++中的命名空间namespace_51CTO博客_c++中的命名空间   2、 C++ #includestring 和 using std::string_yang20141109的博客-CSDN博客 //不光要加头文件,和C语言不同 #include utils/Errors.h //还要加using using android::status_t; using android::INVALID_OPERATION; using android::NO_ERROR; using android::BAD_VALUE; 3、c和c++的差

    2023年04月20日
    浏览(37)
  • webpack < 5 used to include polyfills for node.js core modules by default

    craco.config.js如下

    2024年02月12日
    浏览(33)
  • BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.

    执行启动项目命令时,出现 BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default。。。 报错,原因是由于在webpack5中移除了nodejs核心模块的polyfill自动引入,所以需要手动引入 解决方案: 1 . 安装 npm install node-polyfill-webpack-plugin 2 . 然后在vue.config.json中添加:

    2024年02月16日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包