-
字符串的输出和输入:
用%s输出一个字符串
Printf(”%s”,str);
Prntf(“%s”,&str[0]);
输入字符串:
Scanf(“%s”,str);
注意:(1)如果以%s格式进行输入的话,注意空格问题。如果输入的字符串有空格,则空格之后的字符无法被接受保存。以%s输入,Scanf遇到空格,就结束了
(2)输入的字符串的长度要小于数组的长度(否则越界,容易出问题)
2.字符串的结束符(“\0”)
不使用或者不当使用结束符造成的问题:
-
字符数组初始化时没有使用”\0”,会一直输出知道遇到\0
-
如果字符串中间出现\0,则不会打印\0后面的字符
3.字符串的长度:
-
使用字符串函数:strlen(str)
-
以\0作为条件,进行判断,遇到\0就结束。\0之前就是字符串的长度
4.字符数组和普通数组的区别:没有本质区别
注意:数组类型指的是数组所包含的元素的类型,而不是数组名的类型,数组名永远是一个指针,指向第一个元素的地址,即数组首地址
-
字符数组的每个元素都是char类型,整型数组的每个元素都是int类型。
-
Scanf()和printf()函数有一种格式化字符串%s可以用来整体输入输出字符数组,但是没有特定的格式支持int 类型整体数组输出
-
字符数组,初始化char str[]=“abc”
整型数组,初始化不能去掉大括号
5.字符串处理函数:
1)字符串输出函数:puts()
格式:puts(字符数组名);
注意:(1)puts函数可以自动换行
(2)也可是不是数组的首地址,可以是元素的地址
(3)必须是字符数组
(4)不可以格式化输出。Puts(“%s”,str);错误
2)输入:gets()
格式:gets(数组名);
注意:(1)使用gets可以接受空格。
(2)不安全,长度100,输入120也可以输出,存在越界问题
3)连接一个字符串(需包含string.h):strcat()
格式:strcat(A,B) 把字符串B连接到A的后面
注意:(1)A的长度要足够大,要能够保存A+B
(2)B把A的最后一个字符\0覆盖了
4)字符串拷贝函数strcpy
格式:strcpy(A,B)、
注意:(1)把B拷贝到A,B覆盖A
5) 字符串的比较函数:strcmp
格式:strcmp(A,B);
规则:比较字符的ascii码值,比较在字典中出现的顺治
比较过程:逐个取两个字符串的字符,对应位相比较,从第一位不相同的位开始,就能确定字符串大小。
函数返回值:>0,A>B;<0,A<B;==0 ,A==B
6)字符串的长度计算函数:strlen
格式:strlen(A);
注意:结果不包含\0
6.地址:
1)计算机硬件系统的内部存储器中,拥有大量的存储单元(容量为1字节),为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的地址,每个村吨单元都有一个唯一的地址。
内存地址—内存中存储单元的编号
2)在地址所标识的存储单元中存放数据:
注意:内存单元的地址与内存单元中的数据是两个完全不同的概念
变量地址—系统分配给变量的内存单元的起始地址
7.指针的概念:内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常把这个地址称为指针。对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容。
8.指针变量改良剂定义方法:
1)指针变量:存放指针的变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
注意:严格意义上说,指针是一个地址,是一个常量。指针变量存放一个地址,是一个变量。
2)定义指针变量:
对指针变量的定义包括三个内容:
-
指针类型说明,即定义变量为一个指针比阿娘
-
指针变量名
-
变量值(指针)
一般形式为:类型说明符 *变量名
*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。例如:int *p;//一个指向整型变量的指针。P只能存放一个int类型的变量的地址。
注意事项:
-
* 必须要有,如果没有,相当于定义了一个普通变量
-
指针变量能用来存放数值或者字符之类的么? 不能
-
指针变量,归根结底还是变量,也有全局和局部变量之分
-
一个类型的指针只能指向同类型的变量,不能指向其他类型的变量。
9.指针变量的初始化和引用:
1)指针变量的初始化方法(应该用地址初始化):
(1)定义的同时进行初始化:
完全初始化:
Int a=5;
Int *p=&a;//用a的地址初始化p这个指针变量。另一种描述方法,p指向a
Int *p2=&a, *p1=&a;//p1.,p2都指向了a
部分初始化:
Int *p3=&b,*p4;
P4=&b;
(2)如果定义了一个指针变量,但是我们不知道让这个指针指向谁
Int *p5=NULL;//空指针
Int *p6=0;//空,把一个指针赋值一个空,什么也不指
(3)先定义后初始化:
Int *p;
P=NULL;//不推荐这么写
常见错误:
int *p8=1000;//错误
(4)注意:多个指针变量可以指向同一个地址;指针的指向是可以改变的;指针没有初始化里面是一个垃圾值,我们称为野指针(可能会导致程序崩溃或访问不该方位的数据)
2)用*来获取指针变量指向的存储单元的内容:
定义了一个整型变量 *p,p是一个指针变量
*指针变量 作用:获取指针变量指向的内存空间的内容;
获取指针变量所对应的存储单元
Int a=5;
Int *p=&a;
Int value=*p;//value==5,此处非定义一个指针变量,而是取值
总结“*“的两种用法:
-
用于定义一个指针变量
-
存储指针变量指向的存储空间的内容
Int a=5;
Int *p=&a;
*p=100;
Int value=*p;//vaule==100
地址都占8个字节
10.指针常见的应用场所:
1)在函数中可以修改主调函数中的变量
2)让函数有多个返回值
11.二级指针:
1)如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。也成为”二级指针“
12.定义什么类型的指针就应该指向什么类型的变量:
64位编译器下,任何指针变量都占8个字节。Void *p;//空指针