目录
一、数组
1.一维数组的初始化
- 对单个元素逐一赋值,利用下标进行赋值
- 聚合方式赋值,使用大括号{}进行多个元素的赋值。
int a[5]={1,2,3,4,5}
int b[]={1,1,2,2,3,3} //编译器能够获取数组元素个数
int c[10]={1,2,3,4,5} //前5个元素被赋值,后个元素的值为0
2.字符数组
- 字符数组中,一个元素存放一个字符(注意是单引号)。
- 声明字符数组: char word[10];
- 可以逐个元素赋值,也可以使用聚合方式赋值(没有被赋值的元素默认是空字符'')。
- 字符数组会将字符串结束符'\0'一起保存。字符串结束符'\0'的作用是提示字符串处理函数该字符串已经结束,不需要再输出。
- 字符数据不能给字符数组赋值。
char a[5] = {'H', 'E', 'L', 'L', 'O'}; char b[5]; b = a; //错误 b[0] = a[0]; //正确
- 字符串处理函数
- strcat(字符数组名1, 字符数组名2 ):把字符数组2中的字符串拼接到字符数组1中字符串后面,并删除字符数组1中的'\0'。注意字符数组1的长度要足够大,可以装下拼接后的字符串。
- strcpy(字符数组名1,字符数组名2):把字符数组2中的字符串复制给字符数组1,相当于字符串2覆盖了原来字符数组1中内容,连同'\0'也一同复制。
- strcmp(字符数组名1,字符数组名2):按照ASCII码顺序比较两个数组中的字符串,并返回比较结果。
- 字符串1=字符串2,则返回值为0;
- 字符串1>字符串2,则返回值为正数;
- 字符串1<字符串2,则返回值为负数;
- 当两个字符串比较时常出现不同的字符,则以第一个不同字符比较结果作为整个比较结果。
- strlen(字符数组名):返回字符串实际长度,不包含'\0'。
二、指针
用来存储内存单元地址的变量类型就是指针类型,所以指针变量就是一个专门用来存放内存地址的变量。
1.指针的声明和赋值
- 声明:数据类型 *指针变量名
int *p; float *a, *b;
- 赋值:
int i=100; int *p = &i; //指针变量名是p,而不是*p,将变量i的地址赋值给p。
- 指针变量不能直接赋值。
int *p; p = 100; //错误
- 没有初始化的指针变量成为“野指针”,一般要在定义指针变量的时候将其初始化NULL。
- *是指针运算符,&是取地址运算符,&a表示获取变量a的地址;*p表示获取指针变量p中存储的值。
int a = 1; int *p = &a;
&*p表示先进行*运算,再进行&运算,*p相当于变量a,&*p相当于取变量a的地址。*&a相当于取变量a所在地址中存储的值,即变量a。
- 指针运算p++,对地址(按照字节存放数据)进行运算,加1并并不代表地址加1个字节,而是加上指针变量数据类型所占的字节数,例如int是4个字节,double是8个字节。
- 指针可以指向任意类型的数据,包括空类型void。空数据指针可以接受任意类型的数据,可以将其强制转化为所对应的数据类型。
float a = 1.23f void *p = NULL; p = &a float b = *(float *) p; //将void 指针类型强制转化为float类型指针
- 指针常量:指向的内存地址不能改变,但是可以改变内存地址中的值。指针常量必须初始化。
格式:数据类型 *const p;
int a = 3, b = 4;
int *const p = &a;
//p = &b; //错误,指针常量,不能改变指向的内存地址
*p = 1; //正确,可以改变内存地址中存储的值。
- 指向常量的指针:指向的内存地址可以改变,但是通过该指针修改内存内容是不允许的。
格式:数据类型 const *p;
int a = 3, b = 4
int const * p = &a;
p = &b; //正确,可以改变指向的内存地址。
//*p = 1; //错误,不能通过该指针改变内存地址中存储的值。