c博客作业 指针
0.展示PTA总分
1.本章学习总结
-
一维数组数组名即为地址
-
二维数组名是个二级地址
-
例:对a[3][4]来说 * ( *(a+i)+J)为a[i][j]的值
-
通过指针传参可以改变多个变量的值
-
指针变量的定义:类型名 * 指针变量名 其中类型名是指针指向数据的类型 指针变量名可随意 常用p 因指针翻译为pointer。
-
指针变量的赋值:例:
int i=2; int *p; p=&i;
指针必须赋值 否则造成内存混乱 若不知赋予什么值 可令指针为NULL -
指针作循环条件 通常再定义一个指针 例:
void re(char *p)
{
char *p1;
p1=p;
for(;p1++;*p1!=0)
{
cnt++;
}
}
- 两个变量值的交换:
void exhcange(char *p1,char *p2)
{
char a=*p1;
*p1=*p2;
*p2=a;
}
- 指针的冒泡排序与数组没什么区别 将a[]换成*a即可
- 常用字符串处理函数:
- scanf() gets() fgets(array,number,stdin)这三个函数用来输入字符串 scanf函数遇到空格和回车结束 gets不安全会越界 最好用fgets 遇到回车结束 在字符串的后两位分别是\n和\0 使用strlen时应减1
- puts()函数与printf()函数 puts遇\0变为\n 其他无区别
- 字符串复制函数strcpy(s1,s2) 用s2将s1覆盖 需要确保s1空间足够
- 字符串链接函数 strcat(s1,s2) 将s2链接在s1后面
- 字符串比较函数strcmp(s1,s2),注意其比较的是ASCII码 从数组首项开始一直比较到有一边出现了\0或有一个字符大小不一样结束 若S1>S2返回1;s1=s2 返回0;s1<s2返回-1
函数原型:void *malloc(unsigned size)
申请size长度的空间 若成功则返回指针 通常需强制类型转换 - free()
释放malloc函数申请的空间
1.2本章学习体会
-
指针是c语言的灵魂 且flexible and tough
-
代码量2000行
2.PTA实验作业
6-8 计算最长的字符串长度 (15分)
2.1.1 伪代码
主函数
int i, n;
char *string[MAXN] = {NULL};
定义字符数组 并赋值
调用函数int max_len( char *s[], int n );
通过下标法来选出最长的字符串
for(int i=0;i<n;i++){
if(strlen(s[i])>max){
max=strlen(s[i]);
}
}max初始化为0 每当有字符串的长度更长时 则交换
最后返回max的值
2.1.2 代码截图
2.1.3 总结本题的知识点
本题是对下标法的灵活运用 将一个较为麻烦的题目变得简洁明了
并设计指针传参 字符指针数组传参时 若是char *a[10]则函数括号里也应是char *a[]
2.1.4 PTA提交列表及说明
错误:函数传参时只写了*s 原来没有用下标法而是将所有长度算出来存入数组并排序
2.2 填充矩阵
2.2.1伪代码
观察输出样例 该函数应有三个循环 对应对角线 上三件和下三角
首先将所有元素赋值3
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (i + j<n-1) {
p[i][j] = 3;
再将对角线元素赋值1
else if (i + j == n - 1) {
p[i][j] = 1;
}
最后将下三角赋值2
else if (j + i>n-1) {
p[i][j] = 2;
}
2.2.2 代码截图
2.2.3 总结本题的知识点
对于指向二维数组的指针 可由int(*p)[n]=a
定义 表示p是a[0]的地址
*p即为a[0],**p为a[0][0] 且对于矩阵 可写出行与列的关系找函数关系
2.2.4 PTA提交列表及说明
其实在编译器里错了很多次 主要是行与列的关系没有找精确
2.3 6-5 字符串反正序连接 (10分)
2.3.1伪代码
#include <stdio.h>
void fun (char *s, char *t);
int main()
{ char s[100], t[100];
scanf("%s", s);
fun(s, t);
printf("%s\n", t);
return 0;
}
\\裁判使用
void fun (char *s, char *t){
int cnt=0;
char *c=s;
while(*c不为0)
{
c++;
cnt++;
}
//计算其长度
知道长度后可从最后面往前逆序将元素放到另一个数组
for(int i=cnt-1;i>=0;i--){
*(t+k)=*(s+i);
k++;
}//
最后再按顺序添加
for(int i=0;i<len;i++)
{
*(t+k)=*(s+i);
k++;
}
*(t+k)=0;
并将最后一位赋值0
2.3.2 代码截图
2.3.3 总结本题的知识点
通过对指针的灵活运用 先计算字符数组长度 再逆序 存放 到另一个数组
2.3.4 PTA提交列表及说明
第一次段错误忘记将k赋值0 第二次忘记在数组最后加上\0
3.阅读代码
这个代码将yyyy/mm/dd”加24小时制编程实现将其转换成”mm/dd/yyyy”加12小时制格式的字符串。