指针与数组
如果我们通过函数的值把数组传到函数里面去了,那么这个函数接收到的是什么呢?我们之前试验过将普通变量传入到函数当中去得到的是变量的值,如果我们传入的是指针得到的是地址,那么我们将数组传到函数中得到的就是这个数组本身,我们来做个试验:
#include <stdio.h>
void f(int a[]);
int main( )
{
int a[] = {0,1,2,3,4,5,6,7,8,9};
int min,max;
printf("main sizeof(a)=%lu\n",sizeof(a));
printf("main a=%p\n",a);
f(a);
return 0;
}
void f(int a[]){
printf("f sizeof(a)=%lu\n",sizeof(a));
printf("f a=%p\n",a);
}
运行结果:
在上面的代码中我们看到了我们把数组当作值传到函数f后得到数组的地址和main函数当中的数组地址一模一样,这也证明了我们把数组当作值传递给函数时得到的是其本身。
那么我们知道了地址一样之后如果我们在f函数中修改一下数组的值会发生什么?
#include <stdio.h>
void f(int a[]);
int main( )
{
int a[] = {0,1,2,3,4,5,6,7,8,9};
printf("main sizeof(a)=%lu\n",sizeof(a));
f(a);
printf("a[0]=%d\n",a[0]);
return 0;
}
void f(int a[]){
printf("f sizeof(a)=%lu\n",sizeof(a));
printf("f a=%p\n",a);
a[0]=100;
}
运行结果:
这个时候我们可以发现我们的a[0]
发生了变化变成了100。所以实际上这里的这个数组就是指针。那么函数参数表里面的数组我们之所以写成[]
,是因为它是一个指针。
传入函数的数组成了什么?
函数参数表中的数组实际上是指针
sizeof(a)== sizeof(int*)
但是可以用数组的运算符[]进行运算
数组参数
以下四种函数原型是等价的:
-
int sum(int *ar,int n);
-
int sum(int *, int);
-
int sum(int ar[],int n);
-
int sum(int [],int);
数组变量是特殊的指针
数组变量本身表达地址,所以
-
int a[10]; int*p=a;//无需用&取地址
-
但是数组的单元表达的是变量,需要用&取地址
-
a == &a[0]
[]运算符可以对数组做,也可以对指针做:
- p[0]<==> a[0]
#include <stdio.h>
int main( )
{
int a=0;
int *p=&a;
printf("*p=%d\n",*p);
printf("p[0]=%d\n",p[0]);
return 0;
}
运行结果:
在上面我们可以看到我们完全使用数组来打印变量的值。
***运算符可以对指针做,也可以对数组做: **
- *a= 25;
#include <stdio.h>
int main( )
{
int a[] = {0,1,2,3,4,5,6,7,8,9};
printf("*a=%d\n",*a);
printf("a[0]=%d\n",a[0]);
return 0;
}
运行结果:
在上面我们可以看到我们完全使用指针来打印数组的第一个值。