一、 strlen与sizeof的区别
首先strlen是一个库函数,strlen是求字符串长度的,关注的字符串中是否有\0,统计\0之前出现的字符个数,而sizeof是一个操作符,sizeof只关注占据了多大的内存空间,不关注内存中存放的数据本身,且sizeof的返回值的单位是字节。
eg:
#include <stdio.h> int main() { char arr1[] = "abc"; char arr2[] = { 'a','b','c' }; printf("%d\n", strlen(arr1)); printf("%d\n", strlen(arr2)); printf("%d\n", sizeof(arr1)); printf("%d\n", sizeof(arr2)); return 0; }
编辑
由于arr2中没有\0,所以打印出来的为随机值。
二、static的前世今生
在C语言中: static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数
未用static修饰的局部变量:
编辑
用static修饰的局部变量:
编辑
原因:static修饰局部变量的时候,改变了局部变量的存储类型,普通的局部变量是存储在栈区,被static修饰的变量是存储在静态区的,存储在静态区的变量,出了作用域不会消毁,依然存在,所以静态变量的生命周期就是程序的生命周期。程序结束的时候,静态变量才回收空间。所以其生命周期变长了,而作用域不变。
编辑
未用static修饰的全局变量:
编辑
用static修饰的全局变量:
编辑
全局变量具有外部链接属性,static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部链接属性,这个全局变量只能在自己所在的.c文件中看到,其他源文件中看不到。
未用static修饰函数:
编辑
使用static修饰函数:
编辑
三、关键字 typedef
typedef 顾名思义是类型定义,这里应该理解为类型重命名。
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名 typedef unsigned int uint_32; int main() { //观察num1和num2,这两个变量的类型是一样的 unsigned int num1 = 0; uint_32 num2 = 0; return 0; }
附思维导图:编辑