C博客作业05-指针
0.展示PTA总分(0----2)
展示关于“指针题目集”分数截图。
1.本章学习总结(3分)
整理指针主要知识点,必须包含内容有:
1.1 指针定义、指针相关运算、指针做函数参数。
1.1.1指针定义
定义指针变量的一般形式为:*类型名 指针变量名;
int *p;
在定义指针变量时,要注意以下几点。
- 指针变量名是一个标识符,要按照C标识符的命名规则对指针变量进行命名。
- 指针变量的数据类型是它所指向的变量的类型,一般情况下一旦指针变量的类型被确定后,他只能指向同种类型的变量。
- 在定义指针变量时需要使用指针声明符 * ,但指针声明符并不是指针的组成部分。例如:定义int p;说明p是指针变量,而不是p;
1.1.2指针相关运算
- 取地址运算
int *p, a = 3;
p = &a;
将整型变量a的地址赋给整型指针p,使指针p指向变量a。也就是说,用运算符&取变量a的地址,并将这个地址值作为指针p的值,使指针p指向变量a。
表达式*p = p + 1、++p和(p)++,都是将指针p所指向变量的值加1。而表达式p++等价于(p++),先取p的值作为表达式的值,在将指针p的值加1,运算后,p不再指向变量a。
2. 赋值运算
int a = 3, *p1, *p2; /* 定义整型变量指针p1和p2 */
p1 = &a; /* 使指针p1指向整型变量a */
p2 = p1;
1.1.3指针做函数参数
void merge(int* a, int m, int* b, int n);
1.2 字符指针
包括指针如何指向字符串、字符串相关函数及函数代码原型的理解、字符串相关函数用法(扩展课堂未介绍内容)
char * x = "abcd"; //声明一个字符类型的指针x 指向一个字符串
1、指针类型为char ,指针的类型决定了这个指针指向数据的类型;
2、指针变量 x 自身是有变量地址的,也就是说 x 变量作为一个变量,有自己的内存地址。
那么,这里的赋值语句可以理解为 指针变量x的内存地址上存储了一个字符类型的地址。
1.3 指针做函数返回值
具体格式是什么,注意事项。
1、当使用指针做为函数的返回值时,主函数处的char *p;将获得调用函数char *pf;的值,即一个地址值,如oxAE72。此时需要我们注意的是该地址值所指向的空间是否存在(即已向操作系统声明注册,不会被释放,即可能被其他操作修改);
2、使用栈内存返回指针是明显错误的,因为栈内存将在调用结束后自动释放,从而主函数使用该地址空间将很危险。
1.4 动态内存分配
为什么要动态内存分配,堆区和栈区区别。动态内存分配相关函数及用法。举例为多个字符串做动态内存要如何分配。
栈区(stack): 函数运行时分配,函数结束时释放。由编译器自动分配释放,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
堆区(heap): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS(操作系统)回收。分配方式类似于链表。
动态内存分配中的free()是释放的意思
释放是修改了申请的内存的使用状态,从可用变成不可用,里面的数据还在,但是使用权已经交还给系统
int *p = malloc(sizeof(int) * 10);
free(p);
free(p);
- 当我们对同一块内存进行多次释放的时候,会造成系统的崩溃,这种情况是过度释放造成的.
- malloc申请内存之后,内存使用完,就free,这两个是成对出现的
- 当对一段内存free之后,根据地址还可以访问这段内存,但是内存的所属权已经不在我们手里,会出现崩溃的可能,这种情况称为野指针
- 野指针,过度释放和内存泄漏是常见的三种内存问题.编程时要多注意.
1.5 指针数组及其应用
定义 :char *p[n];
这是一个p数组,数组元素包括p[0]、p[1]、p[2]...p[n-1],分别用来存放一个指针地址,而这些地址指向的是一个char型的字符。
可以将二维数组赋给一指针数组:
char *p[3];//此数组每一个元素都是一个指针
char a[3][4];
for(int i=0;i<3;i++)
{
p[i]=a[i];
}
这里char *p[3] 表示一个一维数组内存放着三个指针变量p[0]、p[1]、p[2],分别指向a[0],a[[1],a[2]所在的行
1.6 二级指针
二级指针:指向指针的指针。
一级指针与二级指针的比较:一级指针的值为地址,地址需要空间来存放,是空间就具有地址
,二级指针就是为了获取这一空间的地址。一级指针所关联的是其值(一个地址)名下空间里
的数据,这个数据可以是任意类型并做任意用途,但二级指针所关联的数据只有一个类型一个
用途,就是地址。
指针的用途:提供目标的读取或改写,而二级指针就是对于内存地址的读取和改写。
二级指针分为指向指针变量的指针和指向数组的指针。
例:
int main()
{
int k,*p,**pp;
k=8;
p=&k;
pp=&p;
printf(“k=%d,p=%d,p=%d\n”,**pp,*pp,p);
return 0;
}
1.7 行指针、列指针
定义格式、主要用法。
int *ptr=*a;
行指针:指的是一整行,不指向具体元素。
列指针:指的是一行中某个具体元素。
可以将列指针理解为行指针的具体元素,行指针理解为列指针的地址。
那么两个概念之间的具体转换是:
*行指针----列指针
&列指针----行指针
例:用列指针输出二维数组。
#include
void main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p= a[0]; // 列指针的定义法
for(; p < a[0] + 12; p++)
{
printf("%d ",*p);
}
return;
}
2.PTA实验作业(7分)
2.1 藏尾诗(2分)
2.1.2 代码截图
贴图展示代码,不要复制。
2.2 合并2个有序数组(2分)
选择合并2个有序数组这题介绍做法。
2.2.2 代码截图
2.3 说反话-加强版(3分)
选择说反话-加强版这题介绍字符指针操作如何操作字符串。并说明和超星视频做法区别。