C问题,关于数组

来源:百度知道 编辑:UC知道 时间:2024/07/04 01:50:46
1. 若有以下定义,则对a数组元素的正确引用是 。
int a[5],*p=a;
A)*&a[5] B)a+2 C)*(p+5) D)*(a+2)

2. 若有以下定义,则对a数组元素地址的正确引用是 。
int a[5],*p=a;
A)p+5 B)*a+1 C)&a+1 D)&a[0]

3. 若有以下定义和语句,则能正确表示a数组元素地址的表达式是 。
double a[5],*p1;
p1=a;
A)a B)p1+5 C)*p1 D)&a[5]

4.若有以下定义,且0<=i<5,则对a数组元素的非法引用是 。
int a[5],*p=a;
A)a[i] B)*(a+i) C)*(p+i) D)*(&a+i)

5.若有以下定义,则数值不为3的表达式是 。
int x[10]={0,1,2,3,4,5,6,7,8,9},*p1;
A)x[3] B)p1=x+3,*p1++
C)p1=x+2,*(p1++) D)p1=x+2,*++p1

6.有四组对指针变量进行操作的语句,正确的组是 。
int *p,*q; q=p;
int a,*p,*q; p=q=&a;
int a,*p,*q; q=&a; p=*q;
int a=20,*p; *p=a;
int a=b=0,*p; p=&a; b=*p;
int a=20,*p,*q=&a; *p=*q;
int a=20,*p,*q=&a; p=q;
int p,*q; q=&p;

7. 执行以下程序后,a的值为【1】,b的值为【2】。
main()
{
int a,b,k=3,m=5,*p1=&k,*p2=&m;
a=p1==&m;
b=(-*p1)/(*p2)

1.选择(D)
题中(A)和(C)形式是对的,但是犯了个下标越界的错误.定义的是int a[5]哪么数组中元素的下标只能是0~4。(B)的表示是错误的,正确的表示方法是(D)。
2.选择(D)
(B)(C)是错的,(A)形式正确但是下标越界。
3.选择(A)
(B)(D)下标越界,(C)表示的是数组元素而非地址。
4.选择(D)
5.选择(C)
(A)是数组中第四个元素,就是3
(B)p1=x+3则p1指向数组中第四个元素,*p1++是先*p1然后再p1++所以是3
(D)p1=x+2则p1指向数组中第三个元素,*++p1是先++p1,则p1指向数组中第四个元素然后再*p1,所以是3
(C)是先*p1后p1++所以是2
6.你没写(A)(B)(C)(D),!!!
7.a=0
b=8
具体如下
main()
{
int a,b,k=3,m=5,*p1=&k,*p2=&m; /*k=3,m=5,*p1=3,*p2=5*/
a=p1==&m; /*即a=(p1==&m);因为"p1=&k"所以(p1==&m)的值为假即0所以a=0*/
b=(-*p1)/(*p2)+8; /*(-*p1)就是-3再除以(*p2)即5就是(-3)/5这里的除法是向0取整所以结果是0再+8就是8*/
printf(“a=%d\n”,a);
printf(“b=%d\n”,b);
}
8.错,应该改成scanf(“%d”,p);
9.不确定。因为*(p+3)下标越界
10.LA注意是大写的LA
while(*p!=‘u’) { printf(“%c”,*p-32); p++; }这句话的意思就是在没有碰到字符‘u’的时候将当前字符转换为大写输出(大写字母的ASSCII码比小写的小32)

C,D,A,A,C,1 2 4 8,FALSE,FALSE,0,LA