程序填空题:指针形式访问数组
Bob曾经用数组完成了一道非常简单的题目:输入n个整数,逆序输出。代码如下:
#include <stdio.h>
int main()
{
int a[10000];
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
for (int i = n - 1; i >= 0; i--)
printf("%d ", a[i]);
return 0;
}
今天,Bob又接到了新的任务,将上面的数组元素访问从下标引用改成指针引用方式。
咱们来帮Bob分析分析,我们已经知道a是数组名,实际上就是数组分配内存的首地址,也是数组元素a[0]的地址。也就是说如果我们定义:
int *p = a;
则指针变量p的值就是数组a的首地址,也是a[0]的地址,此时我们执行$$*$$p运算,则得到a[0]的值。如果我们执行p++运算,p就指向了a[1]的地址,同理,p=p+i,p就指向数组第i个元素的地址。此时,我们再执行$$*$$p,则得到了a[i]的值。
下面咱们来帮助Bob改写程序吧。
#include <stdio.h>
int main()
{
int a[10000];
int *p;
int n;
scanf("%d", &n);
for (p = a; p < a + n; p++)
scanf("%d", @@[p](2));//此处为a[i]地址,即当前指针变量p指向的地址
for (p = a + n - 1;@@[ p >= a](2); @@[p--](2))//从后往前输出
printf("%d ", @@[*p](2));//输出当前元素值
return 0;
}
答案:
第1空:p
第2空: p >= a
第3空:p--
第4空:*p
#include <stdio.h>
int main()
{
int a[10000];
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
for (int i = n - 1; i >= 0; i--)
printf("%d ", a[i]);
return 0;
}
今天,Bob又接到了新的任务,将上面的数组元素访问从下标引用改成指针引用方式。
咱们来帮Bob分析分析,我们已经知道a是数组名,实际上就是数组分配内存的首地址,也是数组元素a[0]的地址。也就是说如果我们定义:
int *p = a;
则指针变量p的值就是数组a的首地址,也是a[0]的地址,此时我们执行$$*$$p运算,则得到a[0]的值。如果我们执行p++运算,p就指向了a[1]的地址,同理,p=p+i,p就指向数组第i个元素的地址。此时,我们再执行$$*$$p,则得到了a[i]的值。
下面咱们来帮助Bob改写程序吧。
#include <stdio.h>
int main()
{
int a[10000];
int *p;
int n;
scanf("%d", &n);
for (p = a; p < a + n; p++)
scanf("%d", @@[p](2));//此处为a[i]地址,即当前指针变量p指向的地址
for (p = a + n - 1;@@[ p >= a](2); @@[p--](2))//从后往前输出
printf("%d ", @@[*p](2));//输出当前元素值
return 0;
}
答案:
第1空:p
第2空: p >= a
第3空:p--
第4空:*p