导言:对于一维数组而言,数组作形参↔指针变量作形参,都可以用下标法和指针法来引用数组元素。
1、数组作形参
?下标法(容易理解)
地址:&a[i]
元素:a[i]
?指针法(推荐使用)
地址:a+i
元素:*(a+i)
?因为编译器将a[i]解释为*(a+i)需要时间,所以直接将a[i]写成*(a+i)可提高执行效率
2、指针变量作形参
?下标法
地址:&p[i]
元素:p[i]
?指针法
地址:p+i
元素:*(p+i)
两个对比
- p+1?p++
- 都不是简单的+1,1指的是1个内存单元
- p++↔p=p+1,p的值改变了
- p+1并没有改变p的值
- a?p
- a是地址常量
- p是地址变量
总结:对于一维数组,
在主函数中,将数组名作为实参,
在被调函数中,将数组作为形参,引用元素用
下标法→便于理解
指针法→提高效率
?没必要用到指针变量
示例
数组作形参
1.1 下标法
void InputArray(int a[], int n) /* 形参声明为数组,输入数组元素值 */
{
int i;
for (i=0; i<n; i++)
scanf("%d", &a[i]); /* 用下标法访问数组元素 */
}
void OutputArray(int a[], int n) /* 形参声明为数组,输出数组元素值 */
{
int i;
for (i=0; i<n; i++)
printf("%4d", a[i]); /* 用下标法访问数组元素 */
printf("\n");
}
1.2 指针法
void InputArray(int a[], int n) /* 形参声明为数组,输入数组元素值 */
{
int i;
for (i=0; i<n; i++)
scanf("%d", a+i); /* 这里a+i等价于&a[i] */
}
void OutputArray(int a[], int n) /* 形参声明为数组,输出数组元素值 */
{
int i;
for (i=0; i<n; i++)
printf("%4d", *(a+i)); /* 这里*(a+i)等价于a[i] */
printf("\n");
}
指针变量作形参
1.3 下标法
void InputArray(int *p, int n) /* 形参声明为指针变量,输入数组元素值 */
{
int i;
for (i=0; i<n; i++)
scanf("%d", &p[i]); /* 形参声明为指针变量时也可以按下标方式访问数组 */
}
void OutputArray(int *p, int n) /* 形参声明为指针变量,输出数组元素值 */
{
int i;
for (i=0; i<n; i++)
printf("%4d",p[i]); /* 形参声明为指针变量时也可以按下标方式访问数组 */
printf("\n");
}
1.4 指针法
void InputArray(int *p, int n) /* 形参声明为指针变量,输入数组元素值 */
{
int i;
for (i=0; i<n; i++)
scanf("%d", p+i); /* 用指针法访问数组元素 */
}
void OutputArray(int *p, int n) /* 形参声明为指针变量,输出数组元素值 */
{
int i;
for (i=0; i<n; i++)
printf("%4d", *(p+i)); /* 用指针法访问数组元素 */
printf("\n");
}