本文仅在博客园发布,认准原文地址:https://www.cnblogs.com/jisuanjizhishizatan/p/15414469.html


问题1:int类型占几个字节?

常见误区:占4个字节。

实际上,C语言标准并未规定int类型所占的字节数。因此,在不同的机型上,所输出的结果可能不同。部分较老版本的C编译器,可能int类型是2字节。

问题1-1:char类型占几个字节?

答案是1个字节。C标准规定了sizeof(char)的结果必定为1,不受处理环境影响。


问题2:下面的代码有何错误?

char s1[10];
//省略的很多操作
if(s1=="123456789")...

很多初学者都会这样写。这样写在语法上没有错误,但是在运行结果上却总会返回错误结果。

s1是一个C风格字符串,也就是char类型的数组(或指针),而"123456789"却是字符串常量。把它们使用==运算符进行比较,比较的不是字符串的内容,而是在比较指针。在表达式中,数组如果后面不带[],就会被解释作指针。

如果需要比较C风格字符串,需要使用strcmp函数来比较,这个函数包含在string.h中。因此,上述代码应该改写为这样:

char s1[10];
//省略的很多操作
if(strcmp(s1,"123456789")==0)...

问题3:下面的代码会正常运行吗?

int a[10],b[10];
for(int i=0;i<n;i++){
...
b=a;
}

在代码编写过程中,我们经常会使用“拷贝数组”这一行为,例如动态规划中的滚动数组。

然而,上面的代码是无法正常运行的。实际上,数组名b,实际上是&b[0],也就是说,b是一个常量,是不可修改的。因此,数组名在表达式中只能作为右值出现。

而指针,其实是可以修改的。但是对于两个指针a和b,执行b=a后,实际上,结果是下面这样:

也就是说,a和b指向同一数组,这显然不是我们想要的。如果要拷贝数组,我们需要使用memcpy函数,同样包含在string.h中。因此,我们应该这样写:

memcpy(b,a,sizeof(a));

这样就可以拷贝数组了。


问题4:const的一些疑问

关于const和指针连在一起,经常让初学者们摸不着头脑。

例如下面几句:

const char *p
char const *p
char* const p
const char* const p

它们各有什么区别?

我这里曾经从《征服C指针》看到了几条非常好的内容,在此给大家分享一下:

因为C语言是美国人发明的,最好还是用英语来读(声明语句)。

规则:从后往前倒序,如果遇到*号,就加上“pointer to”,如果有const,就追加“read-only”。

const在前面和在后面完全相同。

例如,对const char *p进行翻译:

首先看到p:p is

然后是*:p is pointer to

然后是char:p is pointer to char

然后是const:p is pointer to read-only char

翻译为中文:p是指向只读的char的指针

按照这种方式解释,我们对上面四个语句解释如下:

p is pointer to read-only char

p is pointer to read-only char

p is read-only pointer to char

p is read-only pointer to read-only char

照这样,我们得出结论:

const char* p 和char const* p含义完全相同,表示指向的字符是不可变的。

char* const p表示指针自身不可变,指向的字符可变。

而最后一个,指向的字符和指针自身都不可变。

本期内容到此为止。

【原创】C语言和C++常见误区(一)的更多相关文章

  1. C语言和C++篇

    C语言和C++篇 基本上所有主流的编程语言都有String的标准库,因为字符串操作是我们每个程序员几乎每天都要遇到的.想想我们至今的代码,到底生成和使用了多少String!标题上所罗列的语言,可以看成 ...

  2. CHENGDU1-Python编程语言和PEP8规范

    CHENGDU1-Python编程语言和PEP8规范 PEP8规范6条? 答:PEP8规范说白了就是一种规范,可以遵守,也可以不遵守,遵守PEP8可以让代码的可读性更高. 代码编排:---缩进,4个空 ...

  3. 从C,C++,JAVA和C#看String库的发展(一)----C语言和C++篇

    转自: http://www.cnblogs.com/wenjiang/p/3266305.html 基本上所有主流的编程语言都有String的标准库,因为字符串操作是我们每个程序员几乎每天都要遇到的 ...

  4. 聊聊C语言和ABAP

    这个公众号之前的文章,分享的都是Jerry和SAP成都研究院的同事在工作中学到的一些知识和感受.而今天这篇文章,写作的由来是因为最近我又参与了SAP成都数字创新空间应聘者的面试,和一些朋友聊了一些关于 ...

  5. Visual Studio 2019 使用C语言创建动态链接库(Dll)并使用C语言和C#实现调用

    参考网址:https://blog.csdn.net/weixin_34976988/article/details/99625533 一.创建DLL1.建立动态链接库项目 2.创建头文件和源文件 删 ...

  6. NODE.JS学习的常见误区及四大名著

    NODE.JS学习的常见误区及四大名著 前段时间由于不满于社区里很多人对于NODE.JS的种种误解而写了一篇文章名为: NODE.JS之我见:http://www.cnblogs.com/pugang ...

  7. C语言和C++中动态申请内存

      在C语言和C++的动态内存的使用方法是不同的,在C语言中要使用动态内存要包含一个头文件即 #include<malloc.h> 或者是#include<stdlib.h>  ...

  8. c语言和java的区别

    今晚读了一下c程序设计语言,这是一本经典书籍,发现C语言和java有很多是相同的,毕竟java是由c语言进化来的. 我大概从我自己的思考来谈谈不同点 1.c语言是面向过程,主要单位是函数,变量和函数的 ...

  9. 大数据工具比较:R 语言和 Spark 谁更胜一筹?

    本文有两重目的,一是在性能方面快速对比下R语言和Spark,二是想向大家介绍下Spark的机器学习库 背景介绍 由于R语言本身是单线程的,所以可能从性能方面对比Spark和R并不是很明智的做法.即使这 ...

随机推荐

  1. spring boot应用常用配置

    pom.xml <!--自动打包--> <plugin> <groupId>org.springframework.boot</groupId> < ...

  2. 机器学习基本概念:batch_size、epoch、 iteration

    batch_size 单次训练用的样本数,通常为2^N,如32.64.128... 相对于正常数据集,如果过小,训练数据就收敛困难:过大,虽然相对处理速度加快,但所需内存容量增加. 使用中需要根据计算 ...

  3. SpringBoot笔记(7)

    一.单元测试 1.JUnit5简介 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不 ...

  4. Git&Github介绍

    git&github 什么是GIT 是一个源代码管理工具 源代码为什么要管理起来? 你写的东西就叫源代码,第三方的库和框架都不算. 让源代码可以被追溯,主要记录每次变更了什么,谁主导这次变化. ...

  5. 简说yuv

    最近弄了一个读取y4m文件转成yuv的流的事情,记录一些yuv相关的细节 为什么会有yuv 因为我们目前的显示器显示的原理都是三原色,几乎所有的视频数据最后都要转为rgb格式才能渲染到显示屏上,而原始 ...

  6. JS013. 重写toFixed( )方法,toFixed()原理 - 四舍五入?银行家舍入法?No!六舍七允许四舍五入√!

    以下为场景实测与原理分析,需要重写函数请直接滚动至页尾!!! 语法 - Number.prototype.toFixed( ) // toFixed()方法 使用定点表示法来格式化一个数值. numO ...

  7. session案例之验证码

    一.需求分析 其中,一张图片就是一个单独的请求: 一个验证验证码的Servlet,还有一个验证用户名和密码的Servlet,两次都可能有错误信息返回到前端页面,所以前面页面要从request域中获取返 ...

  8. XML基础——extensible markup language

    一.xml概念 1.xml和html区别 其中,xml是纯文本文件,跨语言:浏览器有html解析器也有xml解析器: 2.和properties配置文件区别 二.xml语法 1.基本语法 三.xml组 ...

  9. FastJson之autotype bypass

    FastJson之autotype bypass 在1.2.25版本之后,添加了checkAutoType方法.在方法中引入了白名单(AutoType).黑名单(denyList)和autoTypeS ...

  10. ElasticSearch集成SpringData史上最全查询教程

    1.简单介绍 springboot 使用springdata操作es,ElasticsearchRepository使用QueryBuilder构造查询条件 2.集成es //maven集成 < ...