C博客作业05-指针

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 请说明和超星视频做法区别,各自优缺点。

  • 借鉴了超星视频上的代码,与视频中代码查不多,真就不会写。
posted on 2020-12-27 22:46  姚庆荣  阅读(123)  评论(0编辑  收藏  举报