若有以下说明和语句,且0 <= i < 10, 则下面哪个是对数组元素的错误引用? ( ) int a[]={1,2,3,4,5,6,7,8,9,0}, *p=NULL, i=0; p=a; A. *(a+i) B. a[p-a] C. p+i D. *(&a[i])
时间: 2024-04-18 15:26:20 浏览: 233
错误的引用是 B. a[p-a]。
解析:
- `a` 是一个数组,可以通过 `a[i]` 访问数组中的元素。
- `p` 是一个指针,指向数组 `a` 的首地址。
- `*(a+i)` 表示对数组元素的正确引用,将数组名 `a` 和索引 `i` 相结合。
- `p+i` 表示通过指针 `p` 加上索引 `i` 来访问数组元素。
- `*(&a[i])` 表示对数组元素的正确引用,通过取地址操作符 `&` 获取元素 `a[i]` 的地址,然后再使用解引用操作符 `*` 来访问该地址上的值。
- `a[p-a]` 是错误的引用,因为 `p-a` 得到的是一个偏移量,而不是有效的索引。数组名和指针之间的差值并不能正确访问数组元素。
相关问题
1.改错题 【程序功能】程序建立一个固定大小数组,通过随机数方式对数组内的元素进行赋值。通过函数BubbleSort对数组内的数据按照非递减方式进行排序。最终输出排序后的结果。 【程序调试要求】在给定的程序中,只允许在原语句上进行修改,不能增加或删除整条语句或修改算法。 【运行结果】排序前数组内的所有数据,排序后的按非递减排列的整数 #include <stdlib. h> #include <time. h> #include <iostream. h> int N=10; void BubbleSort(int a, int n); int main() ʃし srand((unsigned int) time(0)); int a[N]={0}; int i; for(i=0;i<N;i++) a[i] =rand()%100; cout<<"The Data Befor Sort:"<<endl; for(i=0;i<N;i++) cout << a[i]<< "\t"; cout<<endl; BubbleSort(a[N],N); cout<<"The Data After Sort:"<<endl; for(i=0;i<=N;i++) cout << a[i]<< "\t"; cout <<endl; return 0; } void BubbleSort(int a, int n) { int i,k,t; int flag=0; i=0; while(i<n-1) { k = n-1; while(k>i) if(a[k-1]>a[k]) { t =a[k-1]; a[k-1 ] =a[k]; a[k]= t; flag=1; 〕 k--; } i++; if(flag=0) break; else flag=0; } }
修改后的代码如下:
```
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
int N = 10;
void BubbleSort(int a[], int n);
int main()
{
srand((unsigned int) time(0));
int a[N] = {0};
int i;
for(i=0; i<N; i++) {
a[i] = rand() % 100;
}
cout << "The Data Before Sort:" << endl;
for(i=0; i<N; i++) {
cout << a[i] << "\t";
}
cout << endl;
BubbleSort(a, N);
cout << "The Data After Sort:" << endl;
for(i=0; i<N; i++) {
cout << a[i] << "\t";
}
cout << endl;
return 0;
}
void BubbleSort(int a[], int n)
{
int i, k, t;
int flag = 0;
i = 0;
while(i<n-1) {
k = n-1;
while(k>i) {
if(a[k-1] > a[k]) {
t = a[k-1];
a[k-1] = a[k];
a[k] = t;
flag = 1;
}
k--;
}
i++;
if(flag == 0) {
break;
}
else {
flag = 0;
}
}
}
```
修改的内容:
1. BubbleSort 函数的参数类型改为 int a[],表示接收一个整数数组。
2. 修改 BubbleSort 函数内的 if(flag=0) 为 if(flag == 0),修正了赋值为比较的错误。
3. 修改 main 函数调用 BubbleSort 函数的参数,将 a[N] 改为 a。
4. 修改 main 函数输出排序后的数据时,for 循环条件将 <=N 改为 <N,否则会多输出一个元素。
注:本次修改仅为演示修改错误程序的过程,实际编程中应该避免出现这样的错误。
1.改错题 【程序功能】 函数relist(…)对一维数组a升序排序。参数num是数组元素个数。 主函数main()利用循环产生30个1000以内的随机整数存入a数组并输出至屏幕,同时将其中的偶数复制到数组b。调用函数relist ()对数组b进行排序,返回后分两行输出数组b中的元素。 【程序调试要求】 在下面给定的程序中含有至少5个错误,调试时只允许在原语句上进行修改,不能增加或删除整条语句或修改算法。 #include<iostream. h> #include<stdlib. h> #include<iomanip. h> #define N 30 void relist(int a[], int num) { int t; for(int i=0;i<num+1;i++) { for(int j=num-1;j>0;j--) { if ( a[j] < a[j+ 1 ] ) { t=a[j]; a[ j]=a[j -1]; a[j-1]=t; } } } } void main() { int a[N],b[N]; int k=0; for(int i=0;i<N;i++) { a[i]=rand()%1000; cout<<setw(6)<<a[i]<< " "; if((i+1)%6==0) cout<<endl; if(a[i]%2==0) b[k]=a[i++]; } relist(int b[N], int N); cout<<"\n 按升序排列的偶数:\n"; for( int j=0;j<k;j++) { cout<<setw(8)<<b[k]; if(j==k/2) cout<<'\n'; } cout<<endl; cout<<"偶数个数:"<<k<<endl; }
修改后的程序如下:
```
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
#define N 30
void relist(int a[], int num) {
int t;
for(int i=0;i<num;i++) {
for(int j=0;j<num-i-1;j++) {
if ( a[j] > a[j+1] ) {
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
void main() {
int a[N],b[N];
int k=0;
for(int i=0;i<N;i++) {
a[i]=rand()%1000;
cout<<setw(6)<<a[i]<< " ";
if((i+1)%6==0) cout<<endl;
if(a[i]%2==0) b[k++]=a[i];
}
relist(b, k);
cout<<"\n 按升序排列的偶数:\n";
for( int j=0;j<k;j++) {
cout<<setw(8)<<b[j];
if(j==k/2) cout<<'\n';
}
cout<<endl;
cout<<"偶数个数:"<<k<<endl;
}
```
修改后的错误如下:
1. 函数relist中的循环条件有误,应该是`for(int i=0;i<num;i++)` 和 `for(int j=0;j<num-i-1;j++)`。
2. 函数relist中的if语句中比较符号应该是`>`而不是`<`。
3. 函数main中调用relist的语句应该是`relist(b, k);`而不是`relist(int b[N], int N);`。
4. 输出数组b中的元素时,应该是`cout<<setw(8)<<b[j];`而不是`cout<<setw(8)<<b[k];`。
5. 输出数组b中的元素时,应该在最后加上`cout<<endl;`。
阅读全文