在一维数组中,存在p+i=a+i, *(p+i)=*(a+i)=*(&a[i])=a[i]
p1+n= a+n= &a[n];代表第n行的首地址。
二维数组:
*(p1+n)+0= *(a+n)+0= *(&a[n])代表n行0列地址。
(*p)[4]指向的是含有4个整型元素的一维数组,默认p=a,指向0行首地址; p指向的二维的0行,加1是指向下一行,不指向每一行元素,要想求行列交点值那就取摸*(*(p+i)+j)、、p+i表示行号,从而转到对应的行列数
例如:(*p)[4]用法,输出任意一行一列的值
#include
void main()
{ int a[3][3]={1,2,3,4,5,6,7,8,9},(*p)[3],i,j;
p=&a[0];
scanf("%d%d",&i,&j);
printf("a[%d,%d]=%d\n",i,j,*(*(p+i)+j));
}
#include
void main()
{ int a[3][3]={1,2,3,4,5,6,7,8,9},*p,i;
p=a[0];
for(i=0;i<9;i++)
{printf("%d\t",*(p+i));}//a[0]+1到a[0]+9可以输出所有的值
printf("\n");
}
最多在一维数组中用到:
*p1=*p2是把p1指向的变量的值改变,但p1所指向的变量不变,
p1=p2,则是p1指向变量改变了,即p1不再指向原变量的地址,改为指向p2所指向的地址.
题目:把数组a复制到b数组上
法1
#include
void main()
{ int *p,*p1,a[]={1,2,3,4,5},i,b[5];
p=a;
p1=b;
for(i=0;i<5;i++,p++,p1++)
{*p1=*p;}//赋值给他,但他们所指的变量都不变
for(i=0;i<5;i++)
{printf("%d\t",b[i]);}
printf("\n");
printf("%d\t",b[4]);//这样可以的,因为它记录了这个数组的地址以及对应素质printf("\n");
}
法2不能用,
#include
void main()
{ int *p,*p1,a[]={1,2,3,4,5},i,b[5];
p=a;
p1=b;
for(i=0;i<5;i++,p++,p1++)
{ p1=p;//导致指向的变量变了
printf("%d\t",*p1);
}
printf("\n");
}
以上几题就用到第一段的方法
案例1 数组名做实形参数
法1:
#include
void s(int a[],int n)
{ int i,t,k=(n-1)/2;
for(i=0;i a[i]=a[n-1-i];//以下三个数组交换值固定格式 a[n-1-i]=t; } } main() { int i; int a[]={1,2,3,0,4,5,6}; for(i=0;i<7;i++) { printf("%d",a[i]); } printf("\n"); s(a,7); for(i=0;i<7;i++) { printf("%d",a[i]);} printf("\n"); } 法2: #include { int i,t,k=(n-1)/2;// for(i=0;i { t=*(p+i); *(p+i)=*(p+n-1-i); *(p+n-1-i)=t; } } main() { int i; int a[]={1,2,3,0,5,6,7}; for(i=0;i<7;i++) { printf("%d",a[i]); } printf("\n"); s(a,7); for(i=0;i<7;i++) { printf("%d",a[i]);} printf("\n"); } #include { int i,j,t; for(j=0;j { for(i=0;i { if(a[i] { t=a[i]; a[i]=a[i+1]; a[i+1]=t;} } } } main() {int a[7]={1,2,3,0,4,5,6},i; for(i=0;i<7;i++) { printf("%d",a[i]);} printf("\n"); s(a,7); for(i=0;i<7;i++) { printf("%d",a[i]); } printf("\n"); } #include { int i,j,t; for(j=0;j { for(i=0;i { if(a[i] { t=a[i]; a[i]=a[i+1]; a[i+1]=t;} } } } main() {int a[10],i; printf("please input 10 numbers:"); for(i=0;i<10;i++) { scanf("%d",&a[i]);} s(a,10); for(i=0;i<10;i++) { printf("%d",a[i]); } printf("\n"); } 案例2数组名作实参,指针做形参数, #include void s(int *p,int n)//调用函数后,就相当于定义指针变量一样,p=a,当做自己数组处理,在之前里面不能出现其他的数组 { int i,j,t; for(j=0;j { for(i=0;i { if(*(p+i)<*(p+i+1)) { t=*(p+i); *(p+i)=*(p+i+1);//这题你应该用指针的。 *(p+i+1)=t;} } } } main() {int a[10],i; printf("please input 10 numbers:"); for(i=0;i<10;i++) { scanf("%d",&a[i]);} s(a,10); for(i=0;i<10;i++) { printf("%d",a[i]); } printf("\n"); } 案例3 实参和形参都是指针变量 就把实参指针变量指向的数组都付给形参指针变量,当做自己的数组案例4 实参为指针变量,形参为数组名 #include void main() {int a[3][4]={1,2,2,2,3,4,4,5,5,6,9,0},i,*p;