这个作业属于哪个班级 | C语言--网络2011/2012 |
---|---|
这个作业的地址 | C博客作业05--指针 |
这个作业的目标 | 学习指针相关内容 |
名字 | 黎钊涵 |
0.展示PTA总分
展示关于“指针题目集”分数截图。
1.本章学习总结
整理指针主要知识点,必须包含内容有:
1.1 指针定义、指针相关运算、指针做函数参数。
- 指针的定义:
指针是一个变量,用来存放地址的变量
指针变量的类型和它所指向变量的类型一致 - 指针的值:是某个变量的地址
例如:
p=&a:把a的值取给p,即p指向a;
p:直接对内存单元操作,改变变量的数据
&:取地址,:取内容
&p与&a相同,为地址
&a与a相同,是变量
(p)++相当于a++:将p所指向的变量值加一;
p++等价于(p++):先取p,然后p自加,此时p不再指向a; - 指针相关运算:
(1)指针+或者-一个数,表示指针加减这个数的类型所占内存的整数倍
(2)指针减去一个指针,表示两个指针之间所差的内存单元或者元素个数,两个指针相加没有意义
(3)关系运算,如果定义了两个指针变量p和q,并且都已经初始化了
p-q:两者之间相差的元素
(int)p-(int)q:两者之间相差的字节数
*和&两个符号优先级是相同的,运算时自右向左
指针的值:所指变量的地址(&是取地址运算符)
& 表示取地址, * 表示取内容
&*p 与 &a 相同,是地址
&a 与 a 相同,是变量
(p)++ 等价于 a++ // 将 p 所指向的变量值加一
*p++ 等价于 *(p++) // 先取 *p ,然后 p 自加,此时指针 p 不再指向变量 a
q - p 指针 p 和 q 之间相隔的存储单元数目
(int)q - (int)p 指针 p 和 q 之间的字节数
p + 1/p - 1 指向下一个/上一个存储单元
p < q 相同类型指针可以用关系运算符比较大小
- 指针做函数参数
实参和形参之间的数据传输是单向的,实参可以影响形参,而形参不能影响实参。指针但是可以改变实参指针变量所指向的变量的值
要通过函数调用来改变主调函数中某个变量的值:
(1)主调函数中,将该变量的地址或者指向该变量的指针作为实参
(2)被调函数中,用指针类型形参接受该变量的地址
(3)在被调函数中,改变形参所指向变量的值
void swap2 (int *px, int *py)
{ int t;
t = *px;
*px = *py;
*py = t;
}
- 指针初始化
(1)指针变量必须先定义,然后地址赋值
int a;intp;p=&a;
(2)定义指针的变量时,可同时对对它赋初值
int a;int *p=&a;
(3)不能用数值作为指针变量的初值,可将指针变量初始化为一个空指针
p=0;p=NULL
- 交换
swap1(a,b),在swap函数中会改变形参的值,但不会影响实参的值
不能改变main()中实参的值
swap2(&a,&b),定义swap(int p1,int p2)将p1和p2交换值之后,主调函数的ab,值也会跟着其变化
1.2 字符指针
包括指针如何指向字符串、字符串相关函数及函数代码原型的理解、字符串相关函数用法(扩展课堂未介绍内容)
-
不要引用未赋值的指针
-
定义指针时,先将它的初值置为空
char*s=NULL; -
常用字符串处理函数
-
函数原型在stdio.h或string.h中给出
输入:scanf or fgets
输出:printf or puts
字符串复制:strcpy(str1,str2)
字符串连接:strcat(str1,str2)
字符串比较:strcmp(str,str2)
比较字符串的内容:
if(strcmp(str1,str2)>0)
if(strcmp(str1,str2)<0)
if(strcmp(str1,str2)==0)
字符串长度:strlen(str)
计算字符串长度,不包括' ',fgets()会包括' '
strcpy与strcat问题
源字符串需要足够,否则会出现溢出现象
char *strcpy(char *a,const char *b,size_t n)
将b中所指向的字符串复制到a当中,最多复制n个字节,当b中字节少于n个字节时,a中剩余部分将用空字节填充
char *strcat(char *a,const char *b,size_t n)
将b中所指向的字符串追加到a所指向字符串的结尾,追加最多n个字符
strpbrk(str1,str2)
char *strpbrk(const char *str1,const char *str2)
检索字符串str1中第一个匹配str2中字符串的字符
strrchr()
char *strrchr(const char *str,int c)
参数str所指向字符串中最后一次出现字符c的位置
strstr()
char *strstr(const char *haystack,const char *needle)
字符串haystack中寻找第一次出现字符串needle的位置
引用数组元素:
指针法:*(a+i)or *(p+i)//a为第一个元素的地址,+i指向第i个元素,若为int类型,则i为四个字节
1.3 指针做函数返回值
-
不能返回在函数内部定义的在栈区局部数据对象的地址,这是因为所有的栈区局部数据对象在函数返回时就会消亡,其值不再有效
-
回指针的函数一般都返回全局数据对象或或指向字符串常量指针或堆区的指针或主调函数中数据对象的地址
-
带参数的main()函数格式:
int main(int argc, char *argv[ ])
{
......
}
第1个参数argc接收命令行参数(包括命令名)的个数
第2个参数argv接收以字符串常量形式存放的命令行参数(包括命令名本身也作为一个参数)
- 命令名和各个参数之间用空格分隔,也可以没有参数
1.4 动态内存分配
为什么要动态内存分配,堆区和栈区区别。动态内存分配相关函数及用法。举例为多个字符串做动态内存要如何分配。
- 能够根据实际输入数据的多少来申请和分配内层空间,从而提高内存使用率
堆区和栈区区别:
1.申请方式不同
栈:有系统自动分配
注意:系统首先会去查看栈上是否有足够的区域去开辟该空间,如果有就直接开辟,如果没有则栈溢出
堆:自己申请开辟,并且指明大小
2.底层不同
栈:是连续的空间
堆:不是连续的空间
1.molloc函数:malloc 函数的返回值是一个地址,这个地址就是动态分配的内存空间的起始地址。如果此函数未能成功地执行,如内存空间不足,则返回空指针 NULL。
2.有molloc也要有free,申请后要释放,解放内存
3.free函数:无返回值,它的功能是释放指针变量 p 所指向的内存单元。此时 p 所指向的那块内存单元将会被释放并还给操作系统,不再归它使用。操作系统可以重新将它分配给其他变量使用。
1.5 指针数组及其应用
- 使用数组需要先申请较大内存存放,浪费空间
指针数组表示多个字符串,节省空间 - 一维数组定义的一般格式:类型名 *数组名[数组长度]
指针可以相互转换(时间空间更优化)
1.6 二级指针
定义:指向指针的指针
类型名变量名
intpp = &p;
p变了,pp也跟着改变
地址加数值还是地址
二级地址,一个后是一级地址,2个后才是内容
a+i=a[i],二级指针
*(a+i):a[i],表示第i行首元素地址,一级指针
*(a+i)+j:a[i]+j=&a[i][j],第i行第j个地址,一级地址
**(a+i):a[i][0]
((a+i)+j):a[i][j]
a+i+j:第i+j行二级地址
1.7 行指针、列指针
行指针:
int (*p)[n]
含义:p为指向含有n个元素的一维数组的指针变量,二级指针
行指针p是行地址性质的指针,p+i=a+i!=a[i]二级指针
(p+i)=(a+i)=a[i]一级指针
行指针可以和数组名互相使用,p[i][j]=a[i][j]
列指针:
int a[3][3],*p;
//p=a;列指针,移动指向下一个元素
p=a[0];
*(p+i):表示离a[0][0]第i个位置的元素
2.PTA实验作业
2.1 题目名1
2.1.1 伪代码
选择一题难度较大的题目。请认真写伪代码整理解题思路。自己代码和同学代码比较,说明各自代码特点。
2.1.2 代码截图
贴图展示代码,不要复制。
2.1.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。
2.2 题目名2
选择合并2个有序数组这题介绍做法。
2.2.1 伪代码
2.2.2 代码截图
2.2.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。
展示同学代码,介绍做法具体区别。
2.3 题目名3
选择说反话-加强版这题介绍字符指针操作如何操作字符串。并说明和超星视频做法区别。