2023-2024-1 20231301 《计算机基础与程序设计》第十二周学习总结

发布时间 2023-12-17 20:04:53作者: 20231301周子昂

2023-2024-1 20231301 《计算机基础与程序设计》第十二周学习总结

作业信息

作业 链接
作业课程 <班级>(2023-2024-1-计算机基础与程序设计
作业要求 <作业>(2023-2024-1计算机基础与程序设计第十二周学习总结)
作业目标 <《C语言程序设计》预习第十一章> 《C语言程序设计》
作业正文 <博客>(第十二周学习总结

学习内容总结

《C语言程序设计》第十一章

数组名的意义以及在访问数组元素中的作用。

点击查看代码
#include<stdio.h>
int main()
{
    int a[5],i;
    for(i=0;i<5;i++)
    {
        scanf("%d",a+i);//a+i等于&a[i]
    }
    for(i=0;i<5;i++)
    {
        printf("%d ",*(a+i));//*(a+i)等于a[i]
    }
    return 0;
}
指针运算的特殊性以及在访问数组元素中的作用。

p+1不改变当前指针的指向,p仍然指向原来指向的元素;p++中p指向下一个元素,但是二者都表示指向下一个元素。

点击查看代码
#include<stdio.h>
int main()
{
    int a[5],*p;
    for(p=a;p<a+5;p++)
    {
        scanf("%d",p);//指针法引用数组元素
    }
    for(p=a;p<a+5;p++)
    {
        printf("%d ",*p);
    }
    return 0;
}
#include<stdio.h>
int main()
{
    int a[5],i,*p=NULL;
    p=a;
    for(i=0;i<5;i++)
    {
        scanf("%d",&p[i]);//相当于p+i、a+i、&a[i]
    }
    for(i=0;i<5;i++)
    {
        printf("%d ",p[i]);//相当于*(p+i)、*(a+i)、a[i]
    }
    return 0;
}
int a[3][4]; a+i->&a[i] 代表行地址 a[i]+j 代表&a[i][j] (a[i]+j) 代表a[i][j] a[i][j]<->(a[i]+j)<->((a+i)+j)<->(*(a+i))[j]

通过二维数组的行指针和列指针来引用二维数组元素。

定义一个二维数组的行指针:
int (*p)[4];
定义了指向含有4个元素的一维整型数组的指针变量
p++指向下一行元素
int *p;
p=&a[0][0]; //定义了一个列指针并初始化
p++指向下一个元素的地址

点击查看代码
#include<stdio.h>
#define N 4
void InputArray(int *p,int n,int m)
//void InputArray(int (*p)[N],int n,int m)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            scanf("%d",&p[i*m+j]);
        }
    }
}
void OutputArray(int *p,int n,int m)
//void OutputArray(int (*p)[N],int n,int m)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            printf("%d ",p[i*m+j]);
        }
    }
}
int main()
{
    int a[3][4];
    //InputArray(a,3,4);
    //OutputArray(a,3,4);
    InputArray(*a,3,4);
    OutputArray(*a,3,4);//向二维数组传递0行0列的地址
    return 0;
}
指针数组用于表示多个字符串。
点击查看代码
//指针数组用于表示多个字符串
#include<stdio.h>
#include<string.h>
#define MAX_LEN 10;
#define N 150
void SortString(char *pStr[],int n)
{
    int i,j;
    char *temp=NULL;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n;j++)
        {
            if(strcmp(ptr[j],ptr[i])<0)
            {
                temp=pStr[j];//交换字符串的指针
                pStr[j]=pStr[i];
                pStr[i]=temp;
            }
        }
    }
}
int main()
{
    int i,n;
    char name[N][MAXLEN];
    char *pStr[N];
    scanf("%d",&n);
    getchar();
    for(i=0;i<n;i++)
    {
        pStr[i]=name[i];//将第i行地址赋给数组
        gets(pStr[i]);
    }
    //char *pStr[N]={"America","England","Australia","Sweden","Finland"};
    SortString(pStr,n);
    for(i=0;i<n;i++)
    {
        puts(pStr[i]);
    }
    return 0;
}

动态内存分配是在堆上进行,需要用户手动分配和销毁。
动态内存分配函数需要加上头文件:#include<stdlib.h>
malloc:
原型:void *malloc(unsigned int size)
返回一个通用指针,可以用强制转换的方法将返回的指针值转换为所需的类型
int *pi=NULL;
pi=(int *)malloc(2);
申请2个字节的内存,pi指针变量指向这段存储空间的首地址
pi=(int *)malloc(sizeof(int));用于不能确定某种类型所占内存的字节数

calloc:
原型:void *calloc(unsigned int num,unsigned int size);
第一个参数表示申请空间的数量,第二个参数表示每个空间的字节数
pi=(int )calloc(10,sizeof(int));
pi=(int )malloc(10
sizeof(int));
从安全考虑,前者更好。因为calloc能将分配的内存初始化为0。

free:
原型:void free(void *pi);
形参指向分配的内存地址,释放该指针指向的内存空间。

realloc:
原型:void *realloc(void *p,unsigned int size)
将p所指向的存储空间的大小改为size个字节

点击查看代码
#include<stdio.h>
#include<stdlib.h>
void InputArray(int *p,int m,int n)
{
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&p[i*n+j]);
        }
    }
}
double OutputArray(int *p,int m,int n)
{
    int i,j,sum=0;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            sum+=p[i*n+j];
        }
    }
    return (double)sum/(m*n);
}
int main()
{
    int *p=NULL,m,n;
    double aver;
    scanf("%d",&m);//m个班级
    scanf("%d",&n);//一个班级n个学生
    p=(int *)calloc(m*n,sizeof(int));
    if(p==NULL)
    {
        exit(0);
    }
    InputArray(p,m,n);
    aver=Average(p,m,n);
    printf("%lf\n",aver);
    free(p);//释放动态分配的内存空间
    return 0;
}

学习中的问题

  1. Wireshark
    Wireshark实践
  2. 网站设计
    网站设计