第六天
字符串操作函数:strcat strcpy strcmp strlen
字符串大小比较:和相同位置的字符ASCII值相关,和字符串长度毫无关系.
假设有两个字符串s1 s2
hello123 < hewlo
两个字符串完全一样才会相等
例子:循环从终端读取一些字符串,从这些字符串中找出最大的,以及最小的。
指针:
1、地址是内存提供的
内存提供的地址是以数字的形式来体现的。这里的数字如果单纯站在内存角度思考没有所谓的类型
每个地址表示内存多大空间?一个字节
2、什么是地址? 本质上就是内存上的编号
3、什么是指针?
平时你们看到的所谓的"指针"是一个通称。这个通称被分成两个部分:指针常量、指针变量
什么是指针常量?就是内存地址编号。
什么是指针变量?存放内存地址编号的变量。(存放指针变量的变量)
c语言中变量定义的方式:
数据类型 变量名;
常用的描述语句:a指向了b,a存放了b对应空间首地址(a一定是指针变量)。
int *p = &a;
*p = 100;
如何区分上面两个*
1、在变量的定义语句中*是用来描述类型的作用。
2、在变量的直接赋值中出现*,操作指针指向空间的作用。
double x;
int *p;
p = (int *)&x; 如果赋值语句涉及到强转操作,那么*代表一个指针类型。
p是int *类型
*p = 10;
&和*运算符互逆
二级指针:
int a = 10;
int *p = &a;
int **q = &p;
二级指针变量存放的是一级指针变量的地址。
一定要区分开一个概念:
1、指针变量p的地址是2000,如何获得2000地址? 使用&p
2、指针变量p存放的地址是2000,如何获取2000? 使用p
注意一个很重要的问题:
int *p; //这个指针变量p有指向,但是不知道指向哪里,我们叫做野指针。
这种指针的使用可能不出问题,也可能出问题。随意绝对不能使用。
*p = 100;
指针变量中的运算符:
算数运算符:+ - ++ --
int a;
int *p = &a;
p + 1;跳过了a的空间
一个指针变量+ - 操作跳过几个字节和指针变量指向的空间类型相关
关系运算符:
int *p = &a;
int *q = &b;
数组名:是整个数组空间首地址,数组名是地址常量。
int a[5];
int *p = a;
如何打印某个数组元素:printf("%d\n",a[3]);
printf("%d\n",*(a + 3));
a[i] <==> *(a + i);
因为p存放了a,所以 p + i <==> a + i ==> *(p + i) <==> *(a + i) <==> a[i];
最后一个:c语言规定数组有下标法,指针变量也有下标法, *(p + i) <==> p[i];
学习过程中:前提 int *p = a;
a[i] 永远相等 *(a + i)
*(p + i) 永远相等 p[i]
上下两部分是否相等要看指针和数组名的关系
例子:
1、假设一个数组 int a[5] = {1,2,3,4,5};逆序。
我的要求是,int *p = a;后续操作使用p,不能使用a。
2、假设有一个整型数组:int a[5];
已知一个字符串 char *s = "hello world";
将字符串存放到数组a中。
3、假设有n个人,每个人从1开始查数——1,2,3,查到3的人退出;从第四个人开始1,2,3插数,查到3的人退出
最终只剩一个,打印出剩下的是第几个人。