1.用变量a给出下面的定义
a)一个整型数:
int a
b)一个指向整型数的指针:
int *a
c)一个指向指针的的指针,它指向的指针是指向一个整型数:
int **a
d)一个有10个整型数的数组:
int a[10]
e)一个指向有 10个整型数数组的指针:
int (*a)[10]
2.在 int a = 3, int *p = &a;中,*p 的值是( )
A.变量 a 的地址值;
B.无意义;
C.变量 p 的地址值;
D.3
3.下列定义中,( )是定义了一个指向数组的指针p。
A.int(*p)[7]
B.int *p[7]
C.(int *)p[7]
D.int *p[]
4.有以下说明语句,则正确的赋值语句是()。
int a[5][5]; int *p, **q;
int a[5][5]转换成指针类型为 int (*)[5]
A. p = a;
B. q = *a;
C. q = a;
D. p = *a;
5.设 char *s1, *s2; 分别指向两个字符串,可以判断字符串 s1 和 s2 是否相等的表达式为( )
A. s1 = s2
B. s1 == s2
C. strcpy(s1, s2) == 0;
D. strcmp(s1, s2) == 0;
6.求 n 的值。n=______。
int a[20];
char *p1 = (char *)a;
将int类型a数组强转为char*类型
char *p2 = (char *)(a+5);
int类型a+5 移动了20字节
int n = p2-p1;
20
7.若有说明int(*p)[3],以下叙述正确的是( )
A. p是指针数组 //数组指针
B. (*p)[3]和 *p[3]等价
//前者是数组指针,后者是指针数组不等价
C.p是指向一维数组中任何一个元素的指针
//指针只能指向一个地址
D. p是指向含有3个整形元素的一维数组的指针
8.设数组a[5]=(10,20,30,40,50],已知指针p指向a[1],则表达式*++p的值是 ( )
等价于 ++p;*p
A. 31 B. 30 C. 21 D. 20
9.有以下程序段,执行后,mul的值为( )
int a[] = {1, 3, 5, 7, 9};
int mul, *data, x;
mul=1;
data=&a[1];
for(x=0; x<3; x++)
{
mul *= *(data+x); 1*3*5*7=105
}
printf("%d\n", mul);
A. 945 B. 315 C. 105 D. 15
10.在32位计算机系统上,以下代码的输出结果是什么?
int *a;
char *b;
char c[20];
printf("%d, %d, %d", sizeof(a), sizeof(b), sizeof(c));
32位操作系统指针的字节大小为4 所以结果为4,4,20
11.有以下定义:
int a[]={1, 2, 3, 4, 5, 6, 7, 8 ,9 ,10}, *p = a
下列哪个表达式的值为3:( )
A.p += 2, *(p++) B. p += 2, *++p
A地址由a[0]移到a[2],先解引用再偏移 值为3
B 地址由a[0]移到a[2],先偏移后解引用 值为4
C. p += 3, *p++ D. p += 2, ++*p
C地址由a[0]移到a[3],先解引用再偏移 值为4
D地址由a[0]移到a[3],先解引用后自增 值为5
12.若已定义:int a[6], *p = a, 不能表示 a[1] 地址的表达式是:
A.p+1 B. a+1 C. a++ D. ++p
a++表示的还是a[0]
13..有定义: int x, *p;能使指针变量P指向变量x的语句是:________
A. *p=&x; B. p=&x; C. *p=x; D. p=*&x;
A *p已经解引用不能等于地址
C 将x赋值给*p 但不会使p指向x
D p=*&x等同于p=x x不是地址
14.若有说明int a=2, *p=&a, *q=p;则以下非法的赋值语句是( )。
A. p=q B. *p=*q C. a=*q D. q=a
A p指向a的地址 q指向p p=q都指向a的地址
B 将*q赋值给*p 同时q也指向p
C 将*q赋值给a
15.请写出输出结果
int main()
{
int a[10] = {0};
int *p = a;
int *q = &a[6];
printf("%d\n", q-p);
printf("%d\n", (int)q - (int)p);
}
p=a+0 q=a+6 所以q-p=6
将pq强转成int类型 由他们的地址值相减相差24个字节
(int)q-(int)p=24
16.下面的程序输出的结果是__________
#include <stdio.h>
int a[] = {0, 2, 4, 6, 8};
main()
{
int i;
int *p = a;
for(i = 0; i < 4; i++) a[i] = *p++;
printf("%d\n", a[2]);
}
4
17.数组声明为:short a[3][4],引用第3行第1列的元素写作________。
a. **(a+2) b. *(*a+2) c. a[3][1] d. *(a[3]+1)
b 第一行第三列
c越界
d 越界
18.指针变量p1和p2类型相同,要使p1,p2指向同一个变量,正确的是________。
a. p2=*&p1 b. p2=**p1 c. p2=&p1 d. p2=*p1
19.下列哪个引用是不正确的?
int a[10]={0. 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p=a;
A. a[p-a]; B. *(&a) C. p; D. *(*(a+i));
A p和a地址相同 相当于a[0]
B *&抵消 数组名a 相当于数组的首地址
C p指向a数组
20.下面程序的结果是多少?
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
请问:
p1+5=0x801005
p2+5=0x810028
p1 是unsigned char* 类型 每次偏移一个字节
p2是unsigned long*类型 每次偏移8个字节
21.请写出以下程序输出内容。(小端环境)
void main()
{
int a[4] = {1, 2, 3, 4};
int *p1 = (int *)(&a +1);
int *p2 = (int *)((char *)a + 1);
printf("0x%x, 0x%x", *(p1-1), *p2);
}
&a是指向整个数组的指针,+1偏移16个字节
p1-1向前偏移四个字节 所以*(p1-1)=4
先将a强转成char*类型 偏移一个字节 也就是a[0]的第二个字节
int*要操作四字节 所以·结果为0x02 00 00 00
22.用 C 语言编程,向内存0xff9527地址上存入一个整型数0x123
#include <stdio.h>
int main()
{
int *p=0xff9527;
*p=0x123;
}
实际这种是无法编译通过的