跟我学C语言(第六天)

来源:互联网 发布:制皮分解抑魔金数据 编辑:程序博客网 时间:2024/04/28 03:12
第六天

字符串操作函数: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的人退出
最终只剩一个,打印出剩下的是第几个人。