c语言细节 ----错题总结

本文详细讲解了sizeof和strlen在处理字符串时的作用,以及使用双引号和花括号赋值char[]的区别,同时通过实例解析了如何用指针完成变量赋值。重点讨论了`sizeof`的特殊行为和`*p=*&j`在指针赋值中的应用。
摘要由CSDN通过智能技术生成

1.sizeof()和strlen()与 “”、{}对char[]赋值的方法

  1. sizeof:用来获取字符串长度的导引,是处理字符串的重要工具。(对于字符串来说,一个元素就是一个字节,\0也会占到一个字节)

  2. strlen:做的是一个计数器。(从字符串第一个开始数,碰到第一个\0就终止

  3. char a[]=“XXX” 这种方式 不管赋值的时候是不是以\0结尾,系统都会默认在XXX后面加一个\0 这个时候系统会开辟n+1个空间给a[](n是我们给的元素个数,符号也算一个字符)

  4. char a[]={‘X’,‘X’,‘X’}这种方式系统不会给后面加一个\0,系统只会开辟n个对应的空间给这个字符串。所以用这种方法的时候最好在末尾加一个’\0’。以免用strlen的时候,统计到目标字符串(的地址)后面的系统元素去了

    就有两个特别要注意的点! !!敲黑板!!

    1. 在用""给char[]赋值的时候要注意sizeof是比给的元素大1的。举个例子:
      在这里插入图片描述
      这个时候给a的元素:’ a ‘;’ b’;’ , '; '\0’分别占一个字符,再加上系统加上去的\0所以sizeof是5,strlen从a开始往后面读,读到给出的\0时候就不读了,所以是3。
    2. 特别要注意的,用{}给char[]赋值的时候要特别注意strlen。举个例子:在这里插入图片描述
      这种情况(没有一开始就自己加一个\0)系统也不会在这个后面加一个\0的,所以sizeof没什么好说,就是这里面对应有几个元素sizeof就是几,but,strlen因为没有碰到\0会继续往后面跑!!这时候的strlen可以说是不确定了,因为我们不知道这个数组后面的迷之区域第几个开始碰到\0,这样统计出来的strlen是>=你给的元素个数的,但是谁也无法确定。

2.问题:若:int i, j=2,*p=&i;,则能完成i=j赋值功能的语句是:

选项:A: i=*p; B: *p=*&j; C:i=&j; D: i=**p

答案:*p=*&j。

以下是详解
**题目给出的:**int *p=&i已经定义了指针p指向了变量i,也就是p的值是变量i的地址,即*p=i。
A:都没涉及到j,严重错误
B: i=*p意思是将指针p所指向的值赋予给i,*p=*&j是指将j的值赋予给指针p所指向的值而指针p指向了变量i,因为就实现将j的值赋予给i
C:i=&j是指将变量j的地址赋予给i;
D:*p等于变量i了,因此 i=**p就已经不能满足实现i=j。

言而简之,简而言之,当*p=&i的时候,*p已经能代表i了,而*&j是取j地址里存的值,所以答案就能简化为i=j;

3.关于枚举类型 enum

正常的用法大家估计都知道,最经典的就是

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

这时,day如果等于MON就代表1,TUE就是2,以此类推,SUN是7;

但是,今天老师考到了一个

在这里插入图片描述

这时候我可以很负责的说这个enum3是3,如果没给出,就会加一。4分没了,吸取教训啊。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值