C博客作业05-指针
这个作业属于哪个班级 | C语言--网络2011/2012 |
---|---|
这个作业的地址 | C博客作业05--指针 |
这个作业的目标 | 学习指针相关内容 |
姓名 | 姚庆荣 |
0.展示PTA总分(0----2)
1.本章学习总结(3分)
1.1 指针定义、指针相关运算、指针做函数参数。
指针定义:
指针是一种类型,被称为“指针类型”。指针类型描述的是一个地址,这个地址指向内存中另外一个对象的位置。(一般以变量所在的内存单元的第一个字节的地址作为指针的地址。
指针运算:
- 1)取地址运算和间接访问运算:(指针类型与所指变量的类型必须一致)
int *p, a = 3;
p =&a;
间接访问改变指针所指的变量
int a =1, x, *p;
p = &a;
x = *p++;
指针p先指向常量a,后将常量a赋值给x,并改变指针的值,使指针p不指向a;
- 2)指针相关运算:
定义 | 运算类型 |
---|---|
*(p)++ | 指针所指内容+1 |
++*p | 指针所指的数值+1 |
p++ | 指针向后移动一位 |
指针做函数参数:
若某变量的地址作为函数的实参,对应的形参就是指针。
void printf(int *a, int *b)//指针作为形参
int a = 3;
int *b;
b = &a;
1.2 字符指针
指针指向字符串:
- 定义字符指针:char *p;
- 内容为字符串,同字符数组;
- 输出字符指针的内容:printf("%s",p);
- p指向字符串的首地址;
字符串相关函数及用法:
函数名 | 函数格式 | 函数作用 |
---|---|---|
#include<string.h> | #include<string.h> | 调用函数的声明 |
strlen | strlen(a) | 计算字符串的长度 |
strcpy | strcpy(a, b) | 把b字符串内容赋给a字符串 |
strcat | strcat(a, b) | 连接a,b2个字符串 |
strcmp | strcmp(a,b) | 比较两个字符串的大小,(a大为1,b大为-1,相等时为0) |
strstr | strstr(a, b) | 找第二个字符串在第一个字符串的出现的第一个地址 |
malloc | a = (char)malloc(msizeof(char)) | 动态申请,结束后释放内存 |
1.3 指针做函数返回值
- 指针在函数内无返回值时应return 0(return NULL)。
- 指针在不同定义类型的函数内的返回值必须与实参保持一致。
- 指针作为函数的返回值时可返回多个值。
1.4 动态内存分配
-
动态内存是相对静态内存而言的。所谓动态和静态就是指内存的分配方式。动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存。
-
以前所写的程序大多数都是在栈上分配的,比如局部变量、形参、函数调用等。栈上分配的内存是由系统分配和释放的,空间有限,在复合语句或函数运行结束后就会被系统自动释放。而堆上分配的内存是由程序员通过编程自己手动分配和释放的,空间很大,存储自由。
-
malloc 函数
void *malloc(unsigned int size);
其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。如:
malloc(100);/*开辟 100 个字节的临时分配域,返回值为其第一个字节的地址*/
(注:指针的基类型为 void,即不指向任何类型的数据,只提供一个地址。如果此函数未能成功的执行(例如内存空间不足),则返回空指针(NULL)。)
- calloc函数
void *calloc(unsigned n, unsigned size)
其作用是在内存的动态存储区中分配n个长度为 size 的连续空间
。函数返回一个指向分配区域的起始位置的指针;如果分配不成功,则返回NULL。
采用 calloc 函数可以为一维数组开辟动态存储空间,n 为数组元素个数,每个元素长度为 size,这就是动态数组。如:
p = calloc(50,4) /*开辟 50*4个字节的临时分配域,把起始地址赋给指针变量p */
- free 函数
void free(void*p);
其作用是释放指针 p 所指向的动态空间,使这部分空间能被其他变量使用。p 是最近一次调用 calloc 或malloc 函数时的返回值。free函数无返回值。如:
free(p); /*释放指针变量p指向的已分配的动态空间*/
1.5 指针数组及其应用
int a[10][10];
for(int i=0;i<10;i++)
scanf("%s",a[0]); //二维数组表示
char *p[10];
int i=0;
for(;i<10;i++)
{
p[i]=(char*)malloc(1024);
scanf("%s",p[i]); //用指针数组表示
}
1.6 二级指针
- 是指向指针的指针,称为二级指针,用于存放二级指针的变量称为二级指针变量.根据指向指针变量的不同情况,二级指针又分为指向指针变量的指针和指向数组的指针。
简单来说就是存储一级指针地址的地址。
1.7 行指针、列指针
定义:
-
行指针:指向某一行,不指向具体的元素。
-
列指针:指向行中具体的元素
用法:
元素a[1][2],列指针表示为a[1]+2,等价表示为(a+1)+2,那么内容是(*(a+1)+2);
2.PTA实验作业(7分)
2.1 查找子串(2分)
2.1.1 伪代码
slen = strlen(s);
tlen = strlen(t);
for(i=0 to slen)
j=i;
while(s[j]==t[k])
k++;j++;
end while
if(k>=tlen)
p=&s[i]; return 0;
end if
k=0;
end for
return 0;
2.1.2 代码截图
2.1.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。
char *search(char *s, char *t)
{
int lens=strlen(s);
int lent=strlen(t);
int i,j,k;
int x=lens-lent;
for (i=0; i<=x; i++)
{
for (j=0,k=i; j<lent; j++,k++)
{
if (s[k]!=t[j]) break;
}
if (j==lent)
break;
}
if (i<=x) return s+i;
else return NULL;
}
- 区别:我的代码将两个数组中数的对比放在循环条件,而同学代码放在循环体中,自我感觉作为条件判断更易让人看懂。
2.2 合并两个有序数组(2)(2分)
2.2.1 伪代码
void merge(int* a, int m, int* b, int n)
{
申请动态内存
for (k=0;i<m&&j<n;k++)
if(ab两个数组的首地址比大小,小的放进c数组然后对应数组下标加一)
end if
end for
if(一组数组赋值到c数组结束,剩下的位置用另一个数组赋值)
end if
for (i = 0; i < k; i++)
a[i] = c[i];
}
2.2.2 代码截图
2.2.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。
区别:我的代码缺少的注释,不易看懂,且套用两层循环,增大了计算量。
2.3 说反话-加强版 (3分)
2.3.1 伪代码
输入数组并计算长度
for (i = len - 1 to 0 )
if (数组不为空格也不为换行符)
记录单词最后一位字母位置
for (j = i - 1 to 0 )
if数组等于空格; break
end if
end for
记录单词第一个字母位置
if不是遍历的第一个单词 输出空格
end if
for (k = first to last )
输出字母
end for
继续遍历
end if
end for
2.3.2 代码截图
2.3.3 请说明和超星视频做法区别,各自优缺点。
- 借鉴了超星视频上的代码,与视频中代码查不多,真就不会写。