01-二维数组-基本概念
二维数组 : 数组中的每一个元素又是一个数组,那么这个数组就称之为二位数组
元素类型 数组名称[一维数组的个数][每个一维数组的元素个数];
元素类型 数组名称[行数][列数];
元素类型 : 说明二维数组中 每个一维数组存储什么类型的数据
一维数组的个数: 说明二维数组 有多少个元素
每个一维数组的元素个数: 说明 二维数组中 每一个一维数组的元素个数
02-二维数组-注意点
1.定义的同时初始化
2. 先定义再初始化
3.完全初始化
4.不完全初始化
5.省略元素个数的写法
6.错误写法
注意点 : 每个一维数组的元素个数 不能省略
03-二维数组和函数
以后 只要看到函数的参数 是一个数组,那么就是地址传递
在函数中修改形参的值 会影响实参
04-字符串-基本概念
用双引号 引起来的就是字符串
字符串 是由什么组成的? 字符"串", 羊肉"串"
05-字符串-常用方法1
/*
printf函数
弊端 : 如果想要换行, 必须加上\n
优点 : 可以自定义格式化 需要输出的字符串,也就是 可以按照我们需要的格式输出
puts函数
优点 : 可以自动换行
缺点 : 不可以自定义格式,只能原样输出
scanf函数
1.利用scanf接收字符串的注意点
scanf接收字符串, 会以空格, tab, 回车作为结束符号, 也就是说利用scanf接收字符串时,字符串中不能出现空格,tab,回车
gets函数
warning: this program uses gets(), which is unsafe.
如果是用gets接收字符串,系统会提示 我们正在使用一个不安全的方法接收字符
优点 : 如果利用gets接收字符串,可以在字符串输入空格,tab
strlen函数
strlen的原理 : 从传入的地址 开始 逐个取出字符串, 每取出一个 让计算器+1, 知道遇到\0位置
计算字符串的个数(不包含\0)
自己写一个strlen函数
// 自定义strlen函数
int myStrlen(char str[])
{
int count = 0;
while (str[count] != '\0') {
count++;
}
return count;
}
*/
06-字符串-常用方法2
#include <string.h>
1.字符串拼接
原理 : 首先遍历第一个字符串,知道遇到\0,然后取出第二个字符串中的字符,从\0的位置开始添加
strcat函数 strcat(dest, src) --- 将src中的数据 拼接到dest后面
注意 : 要想使用字符串的拼接 函数,那么dest必须是一个数组,并且数组的长度 必须大于拼接之后的长度 (str必须足够长)
如果dest的数组的长度,不能完全 存放dest+scr+\0 那么就会报错
strncat函数 strncat(dest, src, len) --- char * 相当于 dest chost char * 相当于 scr size_t 需要拼接的个数
2.字符串拷贝
strcpy函数 strcpy(dest, src) --- char * 目标 , const char * 源
strcpy函数会将 源的数据拷贝到目标中, 并且会覆盖目标中原有的数据
目标的容器必须 能够存放 拷贝的数据,如果容器 不够就会报错
strcpy(str1, str2);
strncpy函数 strncpy(dest, src, len)
拷贝操作 是逐个替换, 拷贝了几个 就替换几个
str1 能够存放元素的个数 - \0
3.字符串比较
strcmp的原理 : 取出字符串中的每一个字符 进行逐个比较, 如果发现不相等 就不会继续往下 比较
如果该值 等于0, 那么证明 两个字符串相等
如果该值 小于0, 那么证明 str 小于 str2
如果该值 大于0, 那么证明 str 大于 str2
07-字符串-练习
1.编写一个函数 char_contains(char str[],char key),如果字符串str中包含字符串key 则返回数值1,否则返回数值0(while 和 for循环实现)
08-字符串数组
如果想存储一堆字符串 那么可以使用字符串数组
说白了 字符串数组 就是二维数组
09-指针-基本概念
如何定义指针变量
普通变量
数据类型 变量名称;
指针变量
数据类型 * 变量名称;
数据类型 : 说明 将来指针变量能够保存 什么类型的变量的地址
注意 : 指针变量是什么类型 : 那么将来就只能保存什么类型的变量的地址
例如 : 指针变量是int, 那么将来就只能保存 int类型变量的地址
* : 没有任何特殊含义, 仅仅是为了标识 这是一个指针变量
变量名称 : 用于区分不同的变量
int num; // 普通变量 num = 10;
int * p; // 指针 , 在64位的编译器下 占用8个字节
p = # // 将num的地址 存储到p这个地址中
(重点 : p = &num --- *p == num)
10-指针-练习1
#pragma 1.定义一个函数交换两个变量的值
void swap(int *v1,int *v2)
{
int temp = *v1;
*v1 = *v2;
*v2 = temp;
}
11-指针-练习2
#pragma 1.要求定义一个函数,传递三个值,返回这三个值和,差,平均值
int demo(int v1,int v2,int v3,int *p1,int *p2);
12-指针-注意点
1.指针只能用于保存地址
2.同一个变量可以有有多个指针 指向他
3.指针的指向可以修改
4.不要访问野指针
错误写法
int *p; // EXC BAD ACCESS ✅正确写法 int *p = NULL; // 0
printf("%i\n",*p);
5.指针类型 是什么类型,就只能指向什么类型的数据
错误写法
double doubleValue = 0.55;
int *p = &doubleValue; (打印0.00) ✅正确写法需要把int 修改成 double
13-多级指针
/*
char c = 'a';
char *cp;
cp = &c;
char **cpp;
cpp = &cp;
*cp == c
*cpp == cp;
**cpp == *(*cpp) == *cp == c
多级指针的操作,最简单的方式,就是通过几颗星来存储,就通过几个星来访问
还有一种方式 就是画图,看图片中有几个箭头,就用几颗星来访问
*/
14-指针为什么要分类型
指针为什么要分类型?
因为当我们利用指针 去取值的时候, 系统就会自动根据指针的类型来确定 应该去多少个字节中的值