第六次博客作业
0.展示PTA
1本章学习的内容
1.1指针定义、指针相关运算、指针做函数参数
- 指针定义
(1)一般形式:类型名 *指针变量名;
(2)定义指针变量要使用指针声明符;类型名指定指针变量所指向变量的类型,必须是有效的数据类型;指针变量名是指针变量的名称,必须是一个合法的标识符。
定义多个指针变量时,每个变量前面都要加指针声明符 - 指针相关运算
(1)取地址运算
单目运算符&用于给出变量的地址。
指针类型和它所指变量的类型必须相同
(2)间接访问运算
*
除了被用于定义指针变量外,还被用于访问指针所指向的变量。
当p
指向a
时,*p
和a
访问同一个存储单元
(3)赋值运算
一旦指针被定义并赋值后,就可以如同其它类型变量一样进行赋值运算。
只能将一个指针的值赋给另一个相同类型的指针 - 指针作为函数的参数
(1)调用函数不能改变实参变量的值,当指针变量作为函数参数时也遵循这个规则。
(2)调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。
(3)将指针作为函数的参数能使函数返回多个值。
1.2 字符指针
- 指针指向字符串
(1)如果定义一个字符指针接收字符串常量的值,该指针就指向字符串的首字符。
(2)字符数组和字符指针都可以用来处理字符串。
为了尽量避免引用未赋值的指针所造成的伤害,在定义指针时,可先将它的初值置为空,如char *s=NULL
- 常用的字符串处理函数
(1)字符串的输入输出
函数scanf()和gets()可以用来输入字符串,printf()和puts()输出字符串。
scanf()遇到回车和空格输入结束,并自动将输入的数据和字符串结束符'\0'送入数组中。
printf()输出遇到'\0'结束。
gets()从输入得到一个字符串,遇到会车结束,自动将输入输入的数据和'\0'送入数组中,gets()输入时允许有空格。
gets()有返回值,如果成功则返回值是字符串的首字符地址,否则返回NULL
puts()输出时遇到'\0'自动将其转换为'\n'。
同样,puts()函数也有返回值,若失败则返回EOF
(2)字符串的复制
char *strcpy(char *s1,char *s2)
该函数把字符串s2复制到s1,直到遇到s2中的'\0'为止。
s1要有足够的空间容纳s2,且s1的内容被覆盖,函数返回的是s1
(3)字符串的连接
strcat(s1,s2)
该函数将s2接到字符串s1后面,此时,s1中原有的结束符'\0'被放置在连接结束后的位置上。
数组s1的长度要足够大
(4)字符串的长度
strlen(s1)可以计算字符串的有效字符个数(不包括'\0')。
1.3指针做函数返回值
指针被作为函数的返回值时可以返回多个值。
指针函数可以返回字符串的首字符地址,从而返回多个值。
1.4动态内存分配
- 动态内存分配步骤
(1)了解需要多少内存空间。
(2)利用C语言提供的动态分配函数来分配所需要的存储空间。
(3) 使指针指向获得的内存空间,以便于指针在该空间内实施运算和操作。
(4) 当使用完毕内存后,释放这一空间。 - 动态内存分配函数
(1)动态内存分配函数malloc()
功能: 在内存的动态存储区中分配一连续空间,其长度为size。若申请成功则返回指向所分配内存空间的起始地址的指针,我申请内存空间不成功则返回NULL。
调用malloc时,应该利用sizeof计算存储块大小,不要直接写数值。
(2)计数动态存储分配函数calloc()
功能: 在内存的动态存储区中分配n个连续空间, 每一存储空间的长度为size并且分配后还把存储块里全部初始化为零,如果申请成功就返回一个指向被分配内存空间的起始地址的指针,若申请内存不成功则返回NULL。
(3)动态存储释放函数free()
原型:void free (void *ptr)
功能: 释放由动态存储分配函数申请到的整块内存空间,ptr为指向要释放空间的首地址,如果ptr的值是空指针,则free什么都不做。该函数没有返回值。
(4)分配调整函数 realloc()
原型:void *realloc(void *ptr,unsigned size)
功能:更改以前的存储分配。
1.5二级指针
(1)A(即B的地址)是指向指针的指针,称为二级指针,用于存放二级指针的变量称为二级指针变量。
(2)首先任何值都有地址 ,一级指针的值虽然是地址,但这个地址做为一个值亦需要空间来存放,是空间就具有地址 ,这就是存放地址这一值的空间所具有的地址,二级指针就是为了获取这个地址。
1.6行指针、列指针
- 行指针
形式:```int(*p)(n)
含义:p为指向含有n个元素的一维数组的指针变量。
行指针可以和数组名互换使用。 - 小结
列指针:表示离a[0][0]的第n个位置的元素;
行指针:表示第n行的首地址。
2.PTA实验作业
2.1藏尾诗
- 伪代码
定义字符型数组a[30];
for(诗的四行)
{
输入一行诗gets;
输出最后一个字;
}
- 代码截图
- 代码比较
同学新建了一个字符数组,我的代码是输入每一行诗的同时输出最后一个字。
2.2
-
伪代码
···
for(0到m+n-1)
{
将a数组和b数组的值按照先后的顺序赋值给c
}
用选择排序法将c排序;
for()
{
将c的值依次赋值给a;
}
··· -
代码截图
-
代码比较
我的代码看似行得通,实则不行;
同学代码灵活运用了malloc函数;
2.3
- 伪代码
for(从最后开始)
{
for{
从最后开始往回找‘ ’;
}
for{
向后输出字符;
}.
}
- 代码截图