1.sizeof()和strlen()与 “”、{}对char[]赋值的方法
-
sizeof:用来获取字符串长度的导引,是处理字符串的重要工具。(对于字符串来说,一个元素就是一个字节,\0也会占到一个字节)
-
strlen:做的是一个计数器。(从字符串第一个开始数,碰到第一个\0就终止)
-
char a[]=“XXX” 这种方式 不管赋值的时候是不是以\0结尾,系统都会默认在XXX后面加一个\0 这个时候系统会开辟n+1个空间给a[](n是我们给的元素个数,符号也算一个字符)
-
char a[]={‘X’,‘X’,‘X’}这种方式系统不会给后面加一个\0,系统只会开辟n个对应的空间给这个字符串。所以用这种方法的时候最好在末尾加一个’\0’。以免用strlen的时候,统计到目标字符串(的地址)后面的系统元素去了
就有两个特别要注意的点! !!敲黑板!!
- 在用""给char[]赋值的时候要注意sizeof是比给的元素大1的。举个例子:
这个时候给a的元素:’ a ‘;’ b’;’ , '; '\0’分别占一个字符,再加上系统加上去的\0所以sizeof是5,strlen从a开始往后面读,读到给出的\0时候就不读了,所以是3。 - 特别要注意的,用{}给char[]赋值的时候要特别注意strlen。举个例子:
这种情况(没有一开始就自己加一个\0)系统也不会在这个后面加一个\0的,所以sizeof没什么好说,就是这里面对应有几个元素sizeof就是几,but,strlen因为没有碰到\0会继续往后面跑!!这时候的strlen可以说是不确定了,因为我们不知道这个数组后面的迷之区域第几个开始碰到\0,这样统计出来的strlen是>=你给的元素个数的,但是谁也无法确定。
- 在用""给char[]赋值的时候要注意sizeof是比给的元素大1的。举个例子:
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分没了,吸取教训啊。