概述
这个作业属于哪个班级 | C语言–网络2011/2012 |
---|---|
这个作业的地址 | C语言博客作业05–指针 |
这个作业的目标 | 学习指针相关内容 |
姓名 | 骆锟宏 |
文章目录
- 0.展示PTA总分
- 1.本章学习总结(3分)
- 1.1 指针定义、指针相关运算、指针做函数参数。
- 1.1.1 指针的定义:
- 1.1.2 指针相关运算:
- 1.1.3 指针做函数参数:
- 1.1.4 对指针变量的操作:
- 1.2 字符指针
- 1.2.1 指针如何指向字符串
- 1.2.2 字符串相关函数及函数码原型的理解
- 1.2.3 字符串相关函数用法(待拓展)
- 1.3 指针做函数返回值(课本278页)
- 1.4 动态内存分配
- 1.4.1 为什么要动态内存分配,堆区和栈区区别。
- 1.4.2 动态内存分配相关函数及用法。
- 1.4.3为多个字符串做动态内存
- 1.5 指针数组及其应用
- 1.5.1 多个字符串用二维数组表示和用指针数组表示区别?
- 1.5.2 指针数组的细节:
- 1.6 二级指针
- 1.7 行指针、列指针
- 1.7.1 行指针
- 1.7.2 列指针
- 2.PTA实验作业(7分)
- 2.1 查找子串(2分)
- 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分)
- 2.3.1 伪代码
- 2.3.2 代码截图
- 2.3.3 请说明和超星视频做法区别,各自优缺点。
0.展示PTA总分
1.本章学习总结(3分)
1.1 指针定义、指针相关运算、指针做函数参数。
1.1.1 指针的定义:
int *ptr; 整型指针,指向整型变量
double *fPtr;浮点型指针,指向浮点型变量
char *cPtr; 字符型指针,指向字符型变量
- 指针没有指向是危险的野指针。会发生段错误!!
特别地,用’NULL’表示空指针; - 指针变量类型要和指向变量类型一致。
- 指针变量占用空间和类型无关.不同类型指针变量占的内存空间大小是一样。
eg. ptr = &integer
1.1.2 指针相关运算:
1.’&‘表示取地址的运算符,运算对象是内容; 运算的值是地址,单目
2.’*'表示取内容的预算符,运算对象是地址; 运算的值是内容,单目
3.&*p 与 &a 相同,是地址
*&a 与a相同,是变量
4. (*p)++ 等价于 a++,将 p 所指向的变量值加1
5. *p++ 等价于 *(p++),先对p(地址)进行向下移动,
再取移动后的地址的内容,此时p不再指向a。
eg,变量a = 3 ,则 &a 表示的就是 存放变量a的内容的地址
而 *(&a) 表示的就是对 地址(&a) 取内容,也就是变量a的内容
在这里也就是 3.
- 需要特别注意的是,’*'会直接对内存单元进行操作,,影响会直接体现在内存上,
只要内存还存在,数据也就存在,可以通过地址来获取。
1.1.3 指针做函数参数:
- 形参用指针变量来定义;
- 实参要传入变量的地址;
- 优点:
1.传入的是地址,数据量少,
2.可以直接对地址操作,效果更好。
3.可以改变多个变量值,比return返回更实用。 - 实例:拆分实数的整数与小数部分
代码如下:
void splitfloat(float x, int* intpart, float* fracpart)
{
*intpart = (int)x;
*fracpart = x - *intpart;
}
*可以返回实数部分和小数部分两个值。
4.可以用数组名直接充当函数的实参;
不过对于数值型数组,要记得传入相关的数组长度;
5.在函数中如果对指针进行移动的操作的话,
最好另外设一个指针变量来移动,因为指针
的首地址的保留很重要!
1.1.4 对指针变量的操作:
- 让指针进行移动,这种情况要注意指针跑到哪里去了;
- 用下标法来操作指针。类似于数组的使用,
所以任何由数组下标来实现的操作都能用指针来完成
3.用类似于下标法的偏移量法来表示指针。
eg.假设有一个数组a[100],有一个指针变量*p且p指向a,
则 p = a(数组名表示数组的首地址) = &a[0]
p + 1 = &a[1] ;
而 p[0] = a[0] = *p
p[1] = a[1] = *(p+1)
p[i] = a[i] = *(p+i)
4.用指针来遍历数组:
下标法:for(i=0;i<n;i++) a[i] or p[i]
指针法:for (p = a; p <a+n; p++) *p
5.其他:
q-p:指针p和q之间元素的个数
(int) q - (int) p:指针p和q之间的字节数
6.指针之间的运算:
q-p
两个相同类型的指针相减,表示它们之间相隔的存储单元的数目
p + 1 or p-1
指向下一个存储单元 / 指向上一个存储单元
注意指针不要越界
p < q
两个相同类型指针可以用关系运算符比较大小
//常用于循环条件的设置中
其他操作都是非法的:
指针相加、相乘和相除,或指针加上和减去一个浮点数
1.2 字符指针
1.2.1 指针如何指向字符串
- 直接指向字符数组的变量名(正确的赋值例子往下看:)
- 字符指针和字符数组的区别:
char sa[ ] = “This is a string”; 如果要改变数组sa所代表的字符串,只能改变数组元素的内容
char *sp =sa; 如果要改变指针sp所代表的字符串,通常直接改变指针的值,让它指向新的字符串 - 两个重点误区:
数组名是常量,不能对它赋值,只能在定义时进行初始化(如上)
sp是指针,只能指向,不能直接赋值(除非加上const)
const char *sp = “This is a string”;
称为 只读变量。必须在定义的时候就给它赋初值 - 代定义字符指针后,没有对它赋值,指针的值不确定,所以要先赋值后使用;
1.2.2 字符串相关函数及函数码原型的理解
*strcat(连接str2到str1后面)
char *strcat( char *str1, const char *str2 )
{
char *tempstr;
tempstr=str1;
if(!str1||!str2) return NULL;//防止空指针传入。否则程序奔溃。
while(*str1) str1++;
while(*str2) {
*str1=*str2;
str1++;str2++;
}
*str1='