指针及动态数组的复习(C语言基础)

版权声明:欢迎转载,转载请标明作者和出处。 https://blog.csdn.net/ljw_study_in_CSDN/article/details/89476652

这篇文章只是为了考试复习而写的,考试只能用C,而且你还必须补充他写的代码,
他写的代码又要求你必须用指针和动态数组(不用指针,代码简单得多),
那没办法了,考前补一下指针和动态数组的使用方法吧。

先给出指针和动态数组的使用方法:

用指针代表一维数组
int *a; //*a即a[0]; *(a+9)即a[9];

要用指针表示二维数组,可以用行指针或列指针

行指针
int (*p)[3],a[3][3]; 
p=a;//则p就是二维数组a
p[i]+j或者*(p+i)+j都表示&a[i][j]*(*(p+i)+j)表示a[i][j]的值,例如p[1][2]表示(*(a+1)+2);
函数编写:int f(int (*p)[3])    
函数调用:f(a)

列指针(把二维数组变成了一维数组)
int *p,a[3][3];
p=*a;//*a用列指针接,a用行指针接
*(p+i*n+j)表示p[i*n+j]
函数编写:int f(int *p)         
函数调用:f(*a)

动态数组申请 
malloc函数,申请一个变量的内存空间,比如int *a=(int*)malloc(sizeof(int));   
calloc函数,申请一个大小为n的数组的内存空间,比如int *a=(int*)calloc(n,sizeof(int));

———————————————————————————————————————————————

以下是练习题,主要是自定义函数进行指针传参以及申请动态空间的应用

———————————————————————————————————————————————

(指针传参,自定义函数排序)nefu 1059 大表哥的指针

考试要求用指针传参,写自定义函数进行排序。
做法是把定义的一维数组a传参到sort(int *a)函数中,编写函数时直接按数组方式进行下标访问即可。

#include <stdio.h>
void sort(int *a)//考试不支持C++,只能自编sort函数,冒泡排序即可
{
    int t;
    for(int i=1;i<=5;i++)
        for(int j=i+1;j<=5;j++)
            if(a[j]<a[i])
            {t=a[i];a[i]=a[j];a[j]=t;}
}
int main()
{
    int a[10];
    while(scanf("%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5])!=-1)
    {
        sort(a);
        printf("%d %d %d %d %d\n",a[1],a[2],a[3],a[4],a[5]);
    }
    return 0;
}

(二维数组,用行指针传参)作业7128

在这里插入图片描述
处理二维数组时用行指针比较方便。注意定义行指针时必须写 (*p)[21],不能写 *p[21]。

#include <stdio.h>
int n,m;
double (*p)[21],a[21][21],ans[21],ave;
void get_ans(double (*p)[21])//写*p[21]会报错,必须写(*p)[21],注意定义二维行指针时变量外一定要打括号!
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            ans[j]=ans[j]+p[i][j];
            ave=ave+p[i][j];
        }
    for(int i=1;i<=m;i++)
        ans[i]=ans[i]/n;
    ave=ave/(n*m);
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
                scanf("%lf",&a[i][j]);
    p=a;//将二维数组a的地址传给指针p,之后把指针当成二维数组用
    get_ans(p);
    for(int i=1;i<=m;i++)
    i==m?printf("%.2lf\n",ans[i]):printf("%.2lf ",ans[i]);
    printf("%.2lf\n",ave);
    return 0;
}

(使用calloc函数)nefu 1634 报数

由于考试只能用C,但是C没有C++的queue,所以只能用数组模拟队列了,可以用calloc函数申请动态的一维数组a,
用法是int *a=(int *)calloc(1001,sizeof(a));
C写法:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int *a=(int *)calloc(1001,sizeof(a));//开一个动态数组a,大小为1001
    int n,m,tmp,cnt,head,tail;
    scanf("%d%d",&n,&m);
    tail=0;//尾下标
    for(int i=1;i<=n;i++)
        a[++tail]=i;//入队
    cnt=0;head=1;//头下标
    while(head<tail)//队列不为空
    {
        cnt++;
        tmp=a[head];head++;//出队
        if(cnt%m!=0)a[++tail]=tmp;//报到的数字不是m则入队
    }
    printf("%d\n",a[head]);
    return 0;
}

C++写法:

#include <bits/stdc++.h>
using namespace std;
queue<int>q;
int main()
{
    int n,m,tmp,cnt;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        q.push(i);
    cnt=0;
    while(q.size()>1)
    {
        cnt++;
        tmp=q.front();q.pop();
        if(cnt%m!=0)q.push(tmp);
    }
    printf("%d\n",q.front());
    return 0;
}

(使用malloc函数)nefu 1026 申请动态空间存放字符串,将其排序后输出

考试要求申请动态空间再排序字符串。
申请单个变量的动态空间,用到malloc函数,用法:
a[i]=(char *)malloc(strlen(tmp)*sizeof(char));//申请a[i]字符串的内存空间,其大小为tmp字符串的长度

#include <stdio.h>
#include <stdlib.h>//这是malloc函数的头文件
#include <string.h>
int n;
char *a[21],tmp[51];
void sort(char *a[21])//字符串按字典序进行冒泡排序
{
    char t[51];
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            if(strcmp(a[j],a[i])<0)
            {strcpy(t,a[i]);strcpy(a[i],a[j]);strcpy(a[j],t);}
}
int main()
{

    while(scanf("%d",&n)!=-1)
    {
        getchar();
        for(int i=1;i<=n;i++)
        {
            scanf("%s",tmp);
            a[i]=(char *)malloc(strlen(tmp)*sizeof(char));//申请a[i]字符串的内存空间,其大小为tmp字符串的长度
            strcpy(a[i],tmp);//把tmp字符串复制给a[i]字符串
        }
        sort(a);
        for(int i=1;i<=n;i++)
        printf("%s\n",a[i]);
    }
    return 0;
}

另附C++的代码,直接用string和sort方便得很,14行就能搞定(考试不让我用C++,我也很无奈啊!)

#include <bits/stdc++.h>
using namespace std;
bool cmp(string x,string y){return x<y;}
int main()
{
    int n;string a[21];
    while(cin>>n)
    {
        for(int i=1;i<=n;i++)cin>>a[i];
        sort(a+1,a+n+1,cmp);
        for(int i=1;i<=n;i++)printf("%s\n",a[i].c_str());
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ljw_study_in_CSDN/article/details/89476652