指针和数组的关系

1.指针与一维数组

(1)演示指针与数组及函数返回多值

#include <stdio.h>
#include <stdlib.h>
int a[20];
int sum(int *pa,int n,int *p)
{
    int ans=0,i;
    *p=a[0];
    for(i=0;i<n;i++)
    {
        ans+=a[i];
        if(*p<a[i]) *p=a[i];
    }
    return ans;
}
int main()
{
    int x,y,i;
    x=10;
    for(i=0;i<10;i++)
        scanf("%d",&a[i]);
    printf("%d\n",sum(a,x,&y));
    printf("%d\n",y);
    return 0;
}

(2)演示数组元素的引用方法【对比】

数组引用

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[5],i;
    for(i=0;i<5;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=0;i<5;i++)
        printf("%d ",a[i]);
    printf("\n");
    return 0;
}

指针引用(1)

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[5],i;
    for(i=0;i<5;i++)
    {
        scanf("%d",a+i);
    }
    for(i=0;i<5;i++)
        printf("%d ",*(a+i));
    printf("\n");
    return 0;
}

指针引用(2)

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[5],*p;
    for(p=a; p<a+5; p++)
        scanf("%d",p);
    for(p=a; p<a+5; p++)
        scanf("%4d",*p);
    printf("\n");
    return 0;
}

(3)演示数组变量作为函数参数

void input(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
}
void input(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("%d",&a[i]);
        printf("\n");
}

(4)演示指针变量作为函数参数

【输入的是地址,输出的是地址中存放的值】

void input(int *pa,int n)
{
    int i;
    for(i=0;i<n;i++,pa++)
        scanf("%d",pa);
}
void input(int *pa,int n)
{
    int i;
    for(i=0;i<n;i++,pa++)
        printf("%d",*pa);
        printf("\n");
}

2.指针与二维数组

(1)一点小的基础知识(☆_☆)/~~

a代表二维数组的首地址,第0行的地址——>行地址
a+i代表第i行的地址,但并非增加一个字节!
*(a+i)即a[i]代表的第i行第0列的地址——>列地址
*(a+i)+j即a[i]+j代表第i行第j列的地址&a[i][j]
*(*(a+i)+j)即a[i][j]代表第i行第j列的内容

逐行查找——>逐列查找

int (*p)[3];
    p=a;
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
        printf("%d",*(*(p+i)+j));

相对偏移量法——逐个查找【相当于p[i*n+j]】

int *p;
    p=*a;
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
        printf("%d",*(p+i*n+j));

(2)演示输入一个二维数组,然后输出这个二维数组的元素值

(1)形参声明为列数已知的二维数组

void input(int p[][N],int m,int n)
{
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
            scanf("%d",&p[i][j]);
    }
}
void output(int p[][N],int m,int n)
{
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
            printf("%d",p[i][j]);
            printf("\n");
    }
}

(2)形参声明为指向列数已知的二维数组的行指针

void input(int (*p)[N],int m,int n)
{
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
            scanf("%d",*(p+i)+j);
    }
}
void output(int (*p)[N],int m,int n)
{
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
            printf("%d",*(*(p+i)+j));
            printf("\n");
    }
}

(3)形参声明为指向二维数组的列指针

void input(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]);
    }
}
void output(int *p,int m,int n)
{
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
            printf("%d",p[i*n+j]);
            printf("\n");
    }
}

(3)演示输入一个4*4的二维数组,并求出各元素之和

#include <stdio.h>
#include <stdlib.h>

int add(int *p)
{
    int i,j,ans=0;
    for(i=0; i<4; i++)
        for(j=0; j<4; j++)
            ans=ans+p[i*4+j];
    return ans;
}
int main()
{
    int i,j,a[4][4];
    int ans;
    for(i=0; i<4; i++)
        for(j=0; j<4; j++)
            scanf("%d",&a[i][j]);
    ans=add(*a);//2维数组带*,表示列地址
    printf("%d\n",ans);
    return 0;
}

(4)演示国名字符串排序【区别两种方式】

char name[N][Max];//二维数组进行比较
for(i=0; i<n-1; i++)
    for(j=i+1; j<n; j++)
    {
        if(strcmp(str[j],str[i])<0)
        {
            strcpy(temp,str[i]);
            strcpy(str[i],str[j]);
            strcpy(str[j],temp);
        }
    }
char *ptr[N];//指针数组
for(i=0; i<n-1; i++)
    for(j=i+1; j<n; j++)
    {
        if(strcmp(ptr[j],ptr[i])<0)
        {
            tmp=ptr[i];
            ptr[i]=ptr[j];
            ptr[j]=tmp;
        }
    }

(3月26日补充内容) 指针变量和数组作为函数参数总结

实参实参写法形参形参写法
简单变量的地址先有定义: int x; 实参:&x指向简单变量的指针int *px
一维数组先有定义: int a[10]; 实参:a一维数组int aa[]
一维数组先有定义: int a[10]; 实参:a,&a[0]指向简单变量的指针int *pa
二维数组先有定义:int a[3][2];实参:a二维数组int aa[][2]
二维数组先有定义:int a[3][2];实参:*a,&a[0][0],a[0]指向简单变量的指针int *pa
二维数组先有定义:int a[3][2];实参:a指向二维数组行的指针int (*pa)[2]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值