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] |