由浅入深——初识C语言_2

目录

1.变量的作用域和生命周期

作用域

生命周期

2.C语言中的常量分为以下几种:

字面常量

const 修饰的常变量

#define 定义的标识符常量

枚举常量

3.字符串和\0 

4.Strlen

5.转译字符


1.变量的作用域和生命周期

作用域

变量使用的范围

1. 局部变量的作用域是变量所在的局部范围。(如括号内)

2. 全局变量(不安全)的作用域是整个工程。在另外一个源文件使用就要extern(声明外部符号)关键字。

extern int a;

生命周期

变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段

1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。

2. 全局变量的生命周期是:整个程序的生命周期。

2.C语言中的常量分为以下几种:

字面常量

{

4;//整型字面常量

3.3;//浮点型字面常量

‘x’;//字符型字面常量

"abcdef";//字符串型字面常量

}

const 修饰的常变量

num本质上是个变量,但是具有了常属性,不能被修改

证明是变量:

num虽然被const修饰,具有了常属性,不能被修改,但是本质上还是变量,所以不能用来指定数组的大小。

C99中,引入了:变长数组的概念,变长数组的大小是可以使用变量来指定的,但是数据不能初始化。如:

#define 定义的标识符常量

#define后不加分号

枚举常量

枚举 - 关键字是enum

//声明一个表示性别的枚举类型
enum Sex
{
    //下面三个符号是Sex这个枚举类型的未来可能取值
    //下面三个符号就是枚举常量
    MALE,
    FEMALE,
    SECRET
};
int main()
{
    enum Sex s = FEMALE;//enum Sex枚举类型,定义了一个s,再用枚举常量进行赋值
    return 0;
}

并且三个枚举常量有值

enum Sex
{
    MALE,
    FEMALE,
    SECRET
};
int main()
{
    printf("%d\n",MALE);//打印出0(默认取值)
    printf("%d\n",FEMALE);//1
    printf("%d\n",SECRET);//2
    return 0;
}

要改变取值

enum Sex
{
    MALE=6,
    FEMALE,
    SECRET
};
int main()
{
    printf("%d\n",MALE);//打印出6
    printf("%d\n",FEMALE);//7
    printf("%d\n",SECRET);//8
    return 0;
}

3.字符串和\0 

C语⾔中如何表⽰字符串呢?使⽤双引号括起来的⼀串字符就被称为字符串,如:"abcdef",就是⼀个 字符串。

字符串的打印格式可以使⽤ %s 来指定,也可以直接打印如下:

int main() 
{ 
    printf("%s\n", "hello C"); 
    printf("hello c"); 
    return 0;
 } 

C语⾔字符串中⼀个特殊的知识,就是在字符串的末尾隐藏放着⼀个 \0 字符,这个 \0 字符是字符串的结束标志。

对于字符串"abcdef",我们实际上看到了6个字符:a,b,c,d,e,f,但是实际上在末尾还隐藏⼀个 \0 转义字符。

 \0 是字符串的结束标志。

所以我们在使⽤库函数 printf() 打印字符串或者strlen() 计算字符串⻓度的时候,遇到 \0 的时候就⾃动停⽌了。

C语⾔中也可以把⼀个字符串放在⼀个字符数组中,我们在这⾥利⽤下⾯的代码验证⼀下 \0 的功能。

int main() 
{ 
    char arr1[] = {'a', 'b', 'c'};//arr1数组中存放3个字符 
    char arr2[] = "abc"; //arr2数组中存放字符串 
    printf("%s\n", arr1); 
    printf("%s\n", arr2); 
    return 0; 
} 

这样的代码,在进行调试的时候,观察⼀下 arr1 和 arr2 的内容

//下面代码,打印结果是什么?为什么?(突出'\0'的重要性)

int main() 
{

    char arr1[] = {'a','b','c'};//arr1数组中存放3个字符
    char arr2[] = "abc";//arr2数组中存放字符串
    printf("%s\n", arr1); 
    printf("%s\n", arr2);
    return 0;

}

arr1和arr2中的内容对比

运行结果:

我们可以看到, arr1 字符数组在打印的时候,打印了 、 、 后还打印了⼀些随机值,这就是因为 arr1 在末尾的地⽅没有 \0 字符作为结束标志,在打印的时候没有停⽌

但是 arr2 的打印就是完全正常 的,就是因为 arr2 数组是使⽤字符串常量初始化的,数组中有 \0 作为技术标志,打印可以正常停⽌。

如果我们在arr1数组中单独放⼀个 '\0' 字符会怎么样呢?

看到三次打印的结果是⼀样的了,都是打印到 \0 的时候就停⽌了,那从上述的例⼦我们确实能够观察到 \0 的作⽤和重要性的

此时再用Strlen来观察:

4.Strlen

int main()
{
    char arr[] = {'a', 'b', 'c'};
    printf("%d\n", strlen(arr));
return 0;
}

strlen是用来获取字符串的长度的,遇到\0字符串结束标志才会结束,对于arr这个字符数组,由于它没有字符串结束标志,所以strlen会一直往后找直到遇到\0才会结束,所以这里是随机值。要把这里改为char arr[]="abc"才可以。因为字符串自动补\0。

5.转译字符

转义字符顾名思义就是转变意思。 下面看一些转义字符。

\130是八进制,转换成10进制就是88,即ASII码表上的X​​​​​​​​​​​​​​​​​​​​​

\x30 x表示是16进制,转换成10进制就是48,即ASII码表上的0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KrisZhang10

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值