1、数组
数组元素个数必须是一个固定的值,可以是整形常量、符号常量及整形常量表达式
数组下标可以是整形常量、整形变量或者整形表达式
数组可以全部初始化,此时元素个数可以省略;也可部分初始化,元素个数不可省略
数组初始化的赋值方式只能用于数组的定义,定义之后再赋值只能一个一个元素赋值
2、内存地址
计算机内存是以字节为单位的存储空间,内存的每一个字节都有一个唯一的编号,这个编号就是地址。当C程序中定义一个变量时,系统就分配一个带有唯一地址的存储单元来存储这个变量,程序对变量的读取操作,实际上是对变量所在地址存储空间进行读取或写入数据。
直接引用:通过变量名引用变量(系统自动将变量名转换为变量的存储地址)
间接引用:将变量的地址存放在一个变量中,然后通过存放变量地址的指针变量来引用该变量
3、指针变量
一个变量的地址称为该变量的指针
用来存放一个变量地址的变量称为指针变量
指针变量定义的一般形式为:类型名 * 指针变量名
注:变量名前面的 "*"是一个说明符,用来说明该变量是一个指针变量,不能省略,但不是变量名的一部分
类型名表示指针变量所指向的变量类型,而且只能指向这种类型的变量
指针变量相关运算符:
& 取地址运算符
* 指针运算符,取内容
注:指针变量用来存放地址,故不能给指针变量赋常数值
指针变量没有指向明确的地址前,不能对它所指向的对象赋值
对指针进行加1操作,会使指针指向下一个元素
示例:指向 int 型数据的指针加1,其指向的地址加4
指向 char 型数据的指针加1,其指向的地址加1
理解关键:
将指针的类型分为两个概念,一个是指针自身的类型,一个是指针指向数据的类型
4、单个字符的输入输出
getchar( ):从输入设备中读取一个字符
例:
char c = getchar( ); 等价于 scanf_s("%c",&c,1);
注:getchar()可以接收回车字符,而scanf()将回车作为数据的间隔符或结束符,且getchar()接收的字符可以不赋给任何变量
putchar( ):将一个字符输出到输出设备
例:
char c = ‘a’; putchar(c);
putchar()可以输出字符型变量、整型变量、字符型常量以及控制字符和转义字符
比较:putchar()一次只能输出一个字符,而printf()一次能输出多个字符
5、字符串
在C语言中,字符序列当作字符串处理,字符串的处理基于字符数组,字符串在存储时其尾部添加结束标志‘\0’('\0'代表ANSI码为0的字符,是一个空操作符)
字符串初始化方式:
char c[10] = {"Hello world"};
char c[10] = "Hello world";
char c[ ] = "Hello world";
char c[9]; scanf("%s",&c,sizeof(c));
6、字符串操作函数
puts( ):字符串输出
gets( ):字符串输入
strlen( ):计算字符串长度
strcat( ):字符串连接
strcmp( ):字符串比较
7、辨析
sizeof( ):计算字节数,包含 '\0'
strlen( ) :计算字符串实际长度,不包含 '\0'
coutof( ):计算字符数组元素个数,包含 '\0'
三者都将空格计入总数
8、二维字符串数组及多维数组
一维字符数组存放一个字符串
二维字符串数组存放多个字符串
多维数组可看作是比其少一个维度的数组的集合
注:二维及二维以上的多维数组,都是先存放低维数据,以此类推
9、二维数组初始化:
理论依据:数组元素在内存中线性存放
全部初始化时,按数组存储顺序赋初值
部分初始化时,高维元素个数可省略,低维元素个数不可省略。但是,要在初始化时体现出高维元素个数,即体现出一维数组个数
10、指针数组
不带下标的二维数组名表示二维数组的起始地址,进行加法操作时则表示作为其元素的一维数组的起始地址
不带下标的一维数组名表示一维数组的起始地址,进行加法操作时则表示该一维数组一个元素的起始地址
即,加法操作时数组降维
例:
int a[3][4],*p;
p = a[0];
此处p指向一维数组a[0]的起始地址,对其进行加法操作时 p+1 等同于 a[0]+1 ,此时 a[0] 降维至 a[0][0],故其指向数组元素 a[0][1],
则 *(p+1)等于元素 a[0][1] 的值
int a[3][4],(*p)[4];
p = a;
此处p指向二维数组a的起始地址,对其进行加法操作时 p+1 等同于 a+1,此时 a 降维至 a[0],故其指向数组元素 a[1],
则 (p+1)等于一维数组名(起始地址),(p+1)+1 等同于 a[1]+1,则 ((p+1)+1) 等同于 a[1][1]
11、函数指针
函数在内存中占有一片连续的内存区域保存其二进制代码,而函数名在C语言中代表这片连续的内存区域的首地址,故函数名可用指针替换
指向函数的指针变量的一般形式为:
数据类型 (*指针变量名) (形参表列)
例: int (*MyFun) (int,int)
数据类型即函数返回值类型
形参表列即函数形式参数表列
12、二级指针
指针本身也是变量,因此也有自己的地址。
我们可以将一个指针变量分为两个部分,一部分存放变量的地址,另一部分是其自身的地址。了解这一点,二级指针的概念就比较容易理解了。
故二级指针就是在一级指针的基础上再增加一个指针,用来存放一级指针的地址,而其本身也有自己的地址,依此类推