有指针*p与数组a[ ]
p=a就等价于p=a[0],a为数组的数组名即代表第一个地址,且还有p+n=a[n]。其实数组也就是一个小型连续指针,数组中的取值的地址都是连续的,例如a[0]地址为967,那么a[1]的地址就为968,依次类推......
关于主函数与子函数之间利用指针传递数组时候的声明格式
1、实参与形参都为数组
#include<stdio.h>
int here(int [],int n);
int main()
{
int a[10];
here(a,10);
}
2、实参为数组,形参为指针
#include<stdio.h>
int here(int *p,int n);
int main()
{
int a[10];
here(a,10);
}
3、实参为指针,形参为数组
#include<stdio.h>
int here(int [],int n);
int main()
{
int a[10];
int *p;
*p=a;
here(p,10);
}
4、实参与形参都为指针
#include<stdio.h>
int here(int *p,int n);
int main()
{
int a[10];
int *o;
o=a;
here(o,10);
}
又因为数组与指针皆用上了地址,所以在子函数中不需要return仍然可以使在子函数重新赋值后的数组返回主函数(因为对应地址的值已经改变了)。
如以下示例:
将一个数组里的数正向输出,以及反向存储并输出的两种不同方式
#include<stdio.h>
int oo(int x[],int n);
int main()
{
int i,a[10]={7,5,4,1,55,2,8,97,12,6};
printf("the origin:\n");
i=0;
for(i=0;i<=9;i++)
{
printf("%d ",a[i]);
}
printf("\nthen:\n");
oo(a,10);
for(i=0;i<=9;i++)
{
printf("%d ",a[i]);
}
}
int oo(int x[],int n)
{
int i,j,m,temp;
j=0,m=0,temp=0;
i=(n-1)/2;
for(j=0;j<=i;j++)
{
m=n-j-1;
temp=x[j];
x[j]=x[m];
x[m]=temp;
}
}
#include<stdio.h>
int oo(int *x,int n);
int main()
{
int i,a[10]={7,5,4,1,55,2,8,97,12,6};
printf("the origin:\n");
i=0;
for(i=0;i<=9;i++)
{
printf("%d ",a[i]);
}
printf("\nthen:\n");
oo(a,10);
for(i=0;i<=9;i++)
{
printf("%d ",a[i]);
}
}
int oo(int *x,int n)
{
int i,*j,*m,temp;
temp=0;
i=(n-1)/2;
j=x;
m=x+n-1;
for(;j<=x+i;j++,m--)
{
temp=*j;
*j=*m;
*m=temp;
}
}
以上仅为个人想法,不具任何参考价值