1.整型变量
在C语言中,使用整型变量可以使用八进制,十进制,十六进制数。其中十进制数没有任何前缀,八进制数需要前缀0, 如010, 0762,,等,十六进制数需要0x前缀,如0xFF, 0x98等。
2.指针
指针常量,在C语言中,指针常量只有一个NULL(空地址),因为程序事先是无法知道某个特定变量在内存中会存储到哪个位置,故指针常量表示为数值字面值没有用。
字符串常量,在C语言中,字符串常量在内存中存储时系统自动在字符串的末尾加一个“\0" 串结束标志,即ASCII码值为0的字符NULL。在程序中,长度为n个字符的字符串常量,在内存中需要占用n+1个字节。比较字符'A' 和字符串 "A"的区别,前者只占一个字节的存储空间,后者占两个字节。
可以将字符串常量赋值给一个”字符类型的指针“,用关于指向这些字符所存储的位置。
3.int* a, b, c .注意此种表达方式中,只有a为整数指针类型, b, c为整数类型。
4.全局变量
对于局部变量的定义和声明,可以不加区分,而对于全局变量则不然。全局变量的定义必须在所有的函数之外,且只能定义一次,一般形式为:
[extern] 类型说明符 变量名, 变量名
全局变量声明出现在要使用该外部变量的各个函数内,在整个程序中,可能出现多次,全局变量声明的一般形式为:
extern 类型说明符 变量名 , 变量名
全局变量在定义时就已经分配了内存单元,并且可以初始赋值。全局变量的声明不能再赋初始值,只是表明在函数内要使用某外部变量。
在同一源文件中,允许全局变量和局部变量同名,在局部变量的作用域内,全局变量不起作用。
5.变量的存储类型
主要有四种,auto 自动变量(一般不加任何修饰的变量为自动变量,auto int a, === int a), static 静态变量, register 寄存器变量, extern 外部变量
自动变量和寄存器变量为动态分配,在程序执行过程中使用它时才分配存储单元,使用完毕即释放(一般是在函数结束时),典型的例子是函数的形参,在函数定义时并不给形参分配参数,只是在函数被调用时才分配,调用函数完毕即释放空间。
静态变量和外部变量为静态分配,即变量定义时就分配一定的存储空间并一直保持不变(存储空间不变).
6.静态变量
静态变量类型说明符为static, 静态变量分为静态局部变量和静态全局变量。
静态局部变量:
静态局部变量在函数内定义它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出函数后,尽管该变量还继续存在,但不能使用它。
允许对构造类静态局部变量赋初值,如果没有赋初值,则系统自动赋为0.
基本类型的静态局部变量若在说明时未赋初值,则系统自动赋为0.
静态全局变量:
存储方式为静态存储,生命周期为全周期。
7.const类型
const 可以定义常量,也可以定义const变量。
int const * a, //表示指向常数的指针类型, 其中指针a 指向的地址存放数据为常数,但指向的地址可以改变
int * const a, // 表示指向整数的常指针,即指针a指向数据为整型,且指向的地址为固定, 但地址存放的数据可以变化
查看const究竟指定了何种数据类型为常量要看const之前的数据类型。
8.++ i 和 i++
自增和自减运算符可用在操作数之前,也可用在操作数之后,但表达式中这两种用法是有区别的。自增或自减运算符在操作数之前,C语言就在引用操作数之前先执行加1或减1的操作,然后将值赋给前面变量;如果自增或自减运算符在操作数之后,C语言就在引用操作数之后执行加1或减1操作。
如i == 2, 此时j = i ++, 执行之后,i == 3, j == 2。。。若j = ++i,则i == j == 3
9 逗号表达式
表达式1, 表达式2, ……, 表达式n
求值过程是分别求出n个表达式的值,然后将表达式n的值作为整个表达式的值。
如 y = (x = a + b), (b + c)
y等于整个逗号表达式的值,即表达式2 (b+c)的值,而x为第一个表达式的值。
10 条件运算符?
EXP1? EXP2:EXP3,如
max = (a>b)? a:b
11sizeof
sizeof为一个单目运算符,它的运算对象为变量或数据类型,运算结果为一个整数。
若运算对象为变量,则所求的结果是这个变量占用的内存空间字节数,若运算对象是数据类型,则所求结果是这种数据类型的变量占用的内存空间字节数。
12.void *memset(void *s, char ch, size_t n);
函数解释:将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 。【注意这是将目的空间每个字节每个字节的进行填充,故一般char , bool等单字节数据类型,直接用即可,而int, long等多字节数据类型,除了全部置零之外,不能直接用】memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
13.C语言中static函数
static函数只能在被定义的源文件中进行调用,不能被外部调用。
14.数组初始化 // 字符数组和字符串不同,字符数组末尾不需要有'\0' . 而字符串需要在末尾提供'\0'
(1)定义时全部初始化
char a[3] = {'a', 'b', 'c'}; //此时数组中只有3个字符,且没有'\0'结束符
(2)定义时部分初始化
char b[4] = {'a', 'b'}; //此时只初始化前两个元素,后面的自动补0
(3)数组全部赋值
若想要对数组中的全部元素赋值,则可以忽略数组下标中的常量,此时,编译器会自动确定数组的大小
char a[] = {'a', 'c', 'b', 'd'};
注意此时[] 不能省略,并且,若单独定义 char a[], 也不行,必须加上数组长度。
数组的元素不能整体赋值,只能单个赋值,如若定义 "char a[10] = {'a'}; 则只为数组的第一个元素赋值为 'a'
15.数组的下标不能用变量
16.字符串的初始化
字符串实际上是一种特殊的字符数组,它规定以'\0' 作为结束符的标识,并且以双引号来代表字符串里的内容。如“abc” 中 含有四个字符
{'a', 'b', 'c', '\0'}
(1) 按照字符数组方式初始化// 最后必须要加 '\0'
char a[4] = {'a', 'b', 'c', '\0'}
(2) 按照字符串双引号方式初始化
char a[4] = {"abc"}
16.指向函数的指针
int (*p)(); //表示指针p 指向返回值为int类型的函数入口地址
int getvalue() { return 3;}
p = getvalue; ( int (*p) = getvalue; )
17.指针数组和数组指针
指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
数组指针:a pointer to an array,即指向数组的指针
还要注意的是他们用法的区别,下面举例说明。
int* a[4] 指针数组
表示:数组a中的元素都为int型指针
元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*
int (*a)[4] 数组指针
表示:指向数组a的指针
元素表示:(*a)[i]
注意:在实际应用中,对于指针数组,我们经常这样使用: