C语言初识(一些小的知识点总结)

C语言特点:

C语言是一门通用的编程语言,广泛应用于系统软件和应用软件的开发,具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点。
注意:C语言传递参数都是值传递,也可以传递指针。

  • 基本数据类型:
    char short int long long long float double

  • ASCII码:
    48 -> 0   57 -> 9  65 -> A   97 -> a  90 -> Z  122 -> z
    空格的ASCII码为32

  • 常量有四种:
    字面常量、const定义的常量、#define定义的常量、枚举常量

  • 结构体与枚举:
    结构体与枚举代码格式一样,但是结构体里的内容是成员变量,而枚举里的内容是可能取值,这些可能取值是一些整型常量
    如果按照%d的格式打印,枚举常量从0开始递增1,而如果在枚举常量里定义了某个值等于一个数字,就从这个数字开始递增1。

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,
	FEMALE = 7,
	SECRET
};
int main() 
{
	printf("%d\n", MALE);		//0
	printf("%d\n", FEMALE);		//7
	printf("%d\n", SECRET);		//8
	return 0;
}

还需要注意,C与C++不同的一点,enum sex s = 3,在C语言里编译通过,正常运行,但在C++里,编译不能通过,因为int不能转换成枚举类型sex。

  • 枚举的好处?

1、枚举类型是强类型的,从而保证了系统安全性。
补充:强类型是针对类型检查的严格程度而言的,它指任何变量在使用的时候必须要指定这个变量的类型,而且在程序的运行过程中这个变量只能存储这个类型的数据。因此,对于强类型语言,一个变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。
2、枚举可以限定参数的个数,对调用者的行为能更加严格地进行控制。
生活中星期,性别等的参数是固定的,如果写成枚举类型,会方便很多。
3、把一些运行期的参数检查放到了编译期。

  • const 修饰标识符,用来定义常量
    const int sz = 10;
    在C语言中 ,const修饰的标识符无法更改 int arr[sz] 出错
    但在C++中,const定义的标识符就是常量。 int arr[sz] 正确

  • 变量
    命名规则:C语言规定必须以字母或下划线_开头。
    注意:标识符不能包括类型,关键字或保留字也不能作为标识符。
    C语言规定的关键字有:(共32个)

auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

auto:自动开辟变量,自动回收,且开辟在栈上。auto是缺省的,默认的,隐含的,比如(auto) int a = 10;
register:寄存器变量,定义为register只是起建议作用,具体是不是寄存器变量取决于编译器。需要注意的是,寄存器变量不可以取地址,因为取地址是在内存上操作,而寄存器变量不在内存上,它比内存操作快很多。
signed:有符号,修饰的是内存。
sizeof:类型要开辟多大的空间。
typedef:类型重命名
void:空,可用在函数,返回值,参数,指针(void *)
volatile:嵌入式和多线程中用的比较多,保证内存的可见性。比如说,一个用const修饰的变量n,编译器认为这是一个常量,把它放在寄存器中,方便下次使用,而改变值的时候只改变了内存中的值,要想最后输出改变后的值,要在const前加上volatile关键字,使内存可见。

(三种自定义类型关键字:)
struct:结构体
enum:枚举
union:联合体或共用体

static:修饰局部变量,修饰全局变量,修饰函数。
思考: 
1、用static修饰的全局变量和一个普通的全局变量有什么区别?
    全局变量本身就是静态存储方式,静态全局变量也是静态存储方式,二者在存储方式上并没有区别。区别在于,非静态全局变量的作用域在整个源程序,当一个源程序由多个源文件组成时,非静态全局变量在任何一个源文件中都是有效的,而用static修饰的静态全局变量只能在定义该变量的源文件内有效。
    注:static全局变量只初始化一次,防止在其他文件中被引用。
2、用static修饰的局部变量和一个普通的局部变量有什么区别?   
   把局部变量改为静态变量是改变了它的存储方式即生命周期,而把全局变量改为静态变量是改变了它的作用域,限制了它的使用范围。
    注:static局部变量只初始化一次,下一次依据上一次的结果。
   
不加static输出10个1:

void test()
{
	int num = 0;
	num++;
	printf("%d\n", num);
}

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		test();
	}
	return 0;
}

加上static输入1-10:

void test()
{
	static int num = 0;
	num++;
	printf("%d\n", num);
}

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		test();
	}
	return 0;
}

总结:一个普通局部变量被static修饰改变了这个变量的生命周期,这个变量的生命周期将和程序的生命周期相同,直到程序结束才销毁。

3、用static修饰的函数和一个普通的函数有什么区别?
   用static修饰的函数为内部函数,只在当前源文件说明和定义。对于可在当前源文件之外使用的函数,应在一个头文件中说明,而要使用这些函数的源文件应该引用这个头文件。
    注:static函数在内存中只有一份,普通函数在每次调用时有一份拷贝。

  • 变量的分类:局部变量和全局变量
    作用域:
      局部变量的作用域是变量所在的局部范围;全局变量的作用域是整个工程。
    生命周期:
      局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
      全局变量的生命周期是:整个程序的生命周期。

  • 变量的默认值:静态变量初始化为0,局部变量不做任何初始化,是随机值。

  • 表达式属性:值属性和类型属性。

你可能感兴趣的:(C)