天天看点

数组、指针、字符串

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、二级指针

指针本身也是变量,因此也有自己的地址。
 我们可以将一个指针变量分为两个部分,一部分存放变量的地址,另一部分是其自身的地址。了解这一点,二级指针的概念就比较容易理解了。
 故二级指针就是在一级指针的基础上再增加一个指针,用来存放一级指针的地址,而其本身也有自己的地址,依此类推
           

继续阅读