数 组
数组的分类
1.一维数组
1.整型数组
2.字符型数组
2.二位数组
3.多维数组
1.一维数组
1.数组的定义方式
存储类型 数据类型 数组名[元素个数]
2.数组的存储方式
数组在内存地址中连续存放
3.数组的初始化
1.局部初始化
int a[5] = {0,1,2};
2.全部初始化
int a[5] = {0,1,2,3,4};
3.默认初始化
int a[] = {0,1,2,3,4};
二维数组
1.定义方式
存储类型 数据类型 数组名[行数][列数]
2.二位数组的初始化
1.全部初始化
int a[2][3] = {{0,1,2},{1,2,3}};
int a[2][3] = {0,1,2,3,4,5};
2.局部初始化
int a[3][4] = {{1,2},{0,3,4}};
3.默认初始化
默认初始化允许行数省略,但绝不
允许列数省略
int a[][4] = {{0,1,2,3},{1,2,3,4},{2,3,4,5}};
3.内存存储方式
int a[n][m]
先存储第一行中所有的元素
再存储第二行中所有的元素
再存放第三行中所有的元素
...
再存放第n行中所有的元素
二维数组可以理解成一个一维数组构成的一维数组
一维数组的使用可以通过for循环的形式来操作
二维数组的使用可以通过双层for循环的形式来操作
多维数组
n维数组就是由n-1维数组构成的一个一维数组
字符数组
1.定义
存储类型 char 数组名[元素的个数]
字符数组元素的个数必须能够存放下字符串末尾的
\0字符
printf("%s",a);
%s 按照字符串形式打印
它会将离数组第一个元素最近的\0中间的字符打印
在终端
2.初始化
1.全部初始化
char a[6] = {'h','e','l','l','o','\0'};
char a[6] = "hello";
2.局部初始化
char a[6] = {'h','e'};
3.默认初始化
char a[] = "hello";
默认初始化a数组中的6个元素
4.赋值
操作字符数组必须通过循环来操作
但是可以通过库文件来直接操作字符数组
string.h
strlen 获得字符串的长度
strcpy 字符串的拷贝
strcmp 字符串的比较
strcat 字符串的拼接
3.char *strcpy(char *dest, const char *src);
功能: 完成字符数组的拷贝
参数:
dest:要拷贝到的数组
src:要拷贝的数组
返回值:
拷贝到的数组名
4.int strcmp(const char *s1, const char *s2);
功能: 比较两个字符串
参数:
s1:其中一个字符数组
s2:另外一个字符数组
返回值:
返回0代表两个字符串相等
返回非0数代表两个字符串不相等
指针
1.作用
1.利用指针可以直接操作内存
2.指针能够使程序更加的简洁、紧凑、高效
2.地址:内存中用来区别不同字节的一个编号
指针:地址就是指针,指针就是地址
指针变量:用来保存指针的变量
3.指针的定义
int *p; p变量中的指针指向一个int类型的数据
char *p; p变量中的指针指向一个char类型的数据
4.指针相关的操作
1.取值: * *p:取指针变量p中保存的指针对应的空间中的值
2.取地址: & &a:取变量a在内存中区域的首地址
5.指针的运算
1.指针的算术运算
int a = 100;
int *p = &a;
+:p+1 向内存高地址偏移数据类型长度个字节
-:p-1 向内存低地址偏移数据类型长度个字节
++:
--:
2.指针的关系运算
1.判断指针变量中是否位空
p == NULL
p != NULL
2.判断指针变量对应的空间是否为空
*p == '\0'
*p != '\0'
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d/n",*(a+1),*(ptr-1));
输出结果是什么?
2 5
3.指针和一维数组的关系
int a[5]; a[0]、a[1]... a[4];
int *p = NULL;
一维数组的数组名就是指向数组第一个元素的
指针
int a[5];
int *p = a;
a[n]的取值方式
a[n] == *(a+n) == *(p+n) == p[n]
用指针实现
1.从终端获得一行字符,字符由数字,字母构成
统计输入数字的个数
统计输入大写字母的个数
统计输入小写字母的个数
2.将字符串"hello world"逆序交换后输出
"dlrow olleh"
3.用指针实现strlen strcat strcpy strcmp