若有以下说明,且0<=i<10,则对数组元素的错误引用是()。 int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p = a, i; A. *(a+i) B. a[p-a+i] C. p+i D. *(&a[i])
时间: 2024-05-28 20:11:01 浏览: 49
正确答案是A. *(a+i)。
在这个代码中,a是一个数组名,它指向数组的第一个元素。p是一个指向整型变量的指针,它指向数组的第一个元素。i是一个整型变量,它的值为未定义。
在C语言中,数组名可以被解释为指向数组第一个元素的指针。因此,a和p所指向的地址相同,即a和p都指向a[0]。
选项A中,*(a+i)表示a数组中第i个元素的值,因为a[i]等同于*(a+i)。
选项B中,p-a表示p指针所指向的地址减去数组a的地址,即0。因此,a[p-a+i]等价于a[i]。
选项C中,p+i表示p指针所指向的地址加上i个整型变量的大小,即p+i指向数组a中的第i+1个元素,而不是第i个元素。
选项D中,&a[i]表示a数组中的第i个元素的地址,*(&a[i])表示该地址中存储的值,等价于a[i]。
相关问题
若有以下说明和语句,且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])
错误的引用是 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` 得到的是一个偏移量,而不是有效的索引。数组名和指针之间的差值并不能正确访问数组元素。
/*通过数组名引用数组元素*/ #include<stdio.h> #include<stdlib.h> #include<time.h>//引入头文件 int main() { int i,a[10]; strand(time(0));//改变随机数发生器的种子 printf("The passing random numbers endows with a value for several:\n"); for(i=0;i<10;i++) *(a+i)=rand()%90+10;//随机生成2位的数字赋给数组元素 for(i=0;i<10;i++) printf("a[%d]=%d\n",i,*(a+i)); printf("\n"); return 0; } 哪里有错
这段代码中有一个错误。`strand`函数应该是`rand`函数,因为`strand`函数并不是C/C++标准库中的函数,而是可能是代码中定义的一个函数或者是笔误。正确的代码应该是:
```
/*通过数组名引用数组元素*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//引入头文件
int main()
{
int i,a[10];
srand(time(0));//改变随机数发生器的种子
printf("The passing random numbers endows with a value for several:\n");
for(i=0;i<10;i++)
*(a+i)=rand()%90+10;//随机生成2位的数字赋给数组元素
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,*(a+i));
printf("\n");
return 0;
}
```
注意到`srand`函数应该是声明在头文件`<stdlib.h>`中的。