1、用变量a给出下面的定义(3C科技、宇视科技,神思电子,中安云科,北京凝思软件)
a) 一个整型数:
b) 一个指向整型数的指针:
c) 一个指向指针的的指针,它指向的指针是指向一个整型数:
d) 一个有10个整型数的数组:
e) 一个指向有 10个整型数数组的指针:
a)int a;
b)int *a;
c)int **a;
d)int a[10];
e)int (*a)[10];
2、在 int a = 3, int *p = &a;中,*p 的值是( ) (华辰泰尔)
A.变量 a 的地址值;
B.无意义;
C.变量 p 的地址值;
D.3
D
3、下列定义中,( )是定义了一个指向数组的指针p。(矩阵软件)
A.int(*p)[7]
B.int *p[7]
C. (int *)p[7]
D. int *p[]
B
4、有以下说明语句,则正确的赋值语句是()。(山大华天)
int a[5][5]; int *p, **q;
A. p = a; B. q = *a; C. q = a; D. p = *a;
分析:
int a[5][5]; //定义二维数组a,5行5列
int *p, **q; //定义一级指针*p和二级指针**p;
A. p=a; //错误赋值
B. q=*a; //
C. q=a; //错误赋值,q=&p
D. p=*a //错误赋值,p
5、设 char *s1, *s2; 分别指向两个字符串,可以判断字符串 s1 和 s2 是否相等的表达式为( ) (山大华天)
A. s1 = s2 B. s1 == s2
C. strcpy(s1, s2) == 0; D. strcmp(s1, s2) == 0;
D
分析:
A. s1 = s2,赋值运算不能判断字符串 s1 和 s2 是否相等。
B. s1 == s2,char *s1, *s2; 分别指向两个字符串,字符串不能直接比较大小。
C. strcpy(s1, s2) == 0; strcpy的作用是拷贝字符串,不能比较大小。
D. strcmp(s1, s2) == 0;strcmp的作用是比较两个字符串的大小,==0说明s1等于s2。
6、求 n 的值。n=______。(山东丁一)
int a[20];
char *p1 = (char *)a;
char *p2 = (char *)(a+5);
int n = p2-p1;
20
分析:
int a[20]; //定义长度20的整型数组,int一位4字节
char *p1 = (char *)a; //定义字符指针p1,对a强转,char一位1字节
char *p2 = (char *)(a+5); //定义字符指针p2,对(a+5)强转
int n = p2-p1; //a的首地址(a[0])与移动5位(a[5])的差是20==4*5
7、若有说明int(*p)[3],以下叙述正确的是( ) (杭州快越科技)
A. p是指针数组
B. (*p)[3]和 *p[3]等价
C. p是指向一维数组中任何一个元素的指针
D. p是指向含有3个整形元素的一维数组的指针
D
分析:
int(*p)[3]的数据类型是:int[];p是数据名,所以int(*p)[3]是数组指针,排除A。*p[3]是指针数组,排除B。int(*p)[3]中p指向的是含有3个整形元素的一维数组的指针,所以排除C,选D。
8、设数组a[5]=(10,20,30,40,50],已知指针p指向a[1],则表达式*++p的值是 ( ) (杭州快越科技)
A. 31 B. 30 C. 21 D. 20
B
分析:
已知指针p指向a[1],说明p现在指向的值是20。表达式*++p,p先自加,即p指向a[2],然后再取值,即p指向的值是30;所以*++p的值是30。
9、有以下程序段,执行后,mul的值为( ) (杭州快越科技)
int a[] = {1, 3, 5, 7, 9};
int nul, *data, x;
nul=1;
data=&a[1];
for(x=0; x<3; x++)
{
nul *= *(data+x);
}
printf("%d\n", nul);
A. 945 B. 315 C. 105 D. 15
C
分析:
int a[] = {1, 3, 5, 7, 9}; //定义长度为5的整型数组
int nul, *data, x; //定义变量nul和x;指针*data
nul=1; //初始化nul=1
data=&a[1]; //初始化指针data=&a[1],即*data==a[1]==3
for(x=0; x<3; x++) //for循环
{
nul *= *(data+x); //nul = nul 乘以 *(data+x)
}
printf("%d\n", nul); //经过3次循环后输出nul==105
x nul data+x nul *= *(data+x) 0 1 3 3 1 3 5 15 2 15 7 105
10、在32位计算机系统上,以下代码的输出结果是什么?(泰华智慧)
int *a;
char *b;
char c[20];
printf("%d, %d, %d", sizeof(a), sizeof(b), sizeof(c));
4 4 20
分析:
int *a; //定义整型指针a
char *b; //定义字符指针b
char c[20]; //定义长度为20字符数组
printf("%d, %d, %d", sizeof(a), sizeof(b), sizeof(c)); //输出a,b,c的字节大小
在32位计算机系统上,指针的字节大小一直是4字节,char是字符类型,一个字符占用1字节,存了20个字符,所以总共占了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
C. p += 3, *p++ D. p += 2, ++*p
A
分析:
int a[]={1, 2, 3, 4, 5, 6, 7, 8 ,9 ,10}, *p = a; //定义长度10的整型数组a,指针p指向数组a的首地址,即a[0]==p[0]
表达式的值为3:即a[3]==3
A. p += 2, *(p++); p=p+2,先*p,再p++;所以*(p++)=*p[2]=3;
B. p += 2, *++p; *++p,p先移动一位,即*p[3]=4
C. p += 3, *p++; p=p+3,所以*(p++)=*p[3]=4;先*p,再p++;
D. p += 2, ++*p p=p+2,所以++*p先*p=3,再自加,即++*p=4。
12、若已定义:int a[6], *p = a, 不能表示 a[1] 地址的表达式是:(云尖软件开发,紫光云数,智洋创新,新华三,石峰)
A. p+1 B. a+1 C. a++ D. ++p
C
分析:
int a[6], *p = a;
定义长度6的整型数组a,指针p指向数组a,即指向数组a的首地址,即p=&a[0]
p+1和a+1,因为p=a;所以p+1=a+1;都表示数组下标+1,即p[1]和a[1]。
因为a是数组名,是一个常量地址,所以a++表达方式是错误的,p是指针名,是一个变量,++p表示p自加1,即p[1]==a[1]。
13、有定义: int x, *p;能使指针变量P指向变量x的语句是:________ (智洋)
A. *p=&x; B. p=&x; C. *p=x; D. p=*&x;
B
分析 :
在C语言中,指针变量用于存储变量的地址,以便通过该地址访问变量的值。为了使指针变量指向某个变量,需要将该变量的地址赋值给指针变量。p是整型指针变量,x是整型变量,p指向a时需要使用&。
14、若有说明int a=2, *p=&a, *q=p;则以下非法的赋值语句是( )。 (智洋)
A. p=q B. *p=*q C. a=*q D. q=a
ABCD
分析:
int a=2, *p=&a, *q=p;
// p=&a; *p=a=2; q=&p; **q=a
所以A. p=q错,B. *p=*q错,C. a=*q错,D. q=a错
15、请写出输出结果 (晟安信息)
int main()
{
int a[10] = {0};
int *p = a;
int *q = &n[6];
printf("%d\n", q-p);
printf("%d\n", (int)q - (int)p);
return 0;
}
6 24
分析:
int main()
{
int a[10] = {0}; //定义长度10的整型数组a,并初始化
int *p = a; //指针p指向a[0]
int *q = &a[6]; //指针q指向a[6]
printf("%d\n", q-p); //q-p=6,输出为6
printf("%d\n", (int)q - (int)p); //强转,int是4字节,所以输出为24
return 0;
}
17、下面的程序输出的结果是__________ (飞音时代)
#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
分析:
#include <stdio.h>
int a[] = {0, 2, 4, 6, 8}; //定义长度5的整型数组
main()
{
int i;
int *p = a; //指针p指向一维数组a,p[0]=a[0]=0
for(i = 0; i < 4; i++) a[i] = *p++;
printf("%d\n", a[2]);
}
18、数组声明为:short a[3][4],引用第3行第1列的元素写作________。(富士安全)
a. **(a+2) b. *(*a+2) c. a[3][1] d. *(a[3]+1)
a
分析:
a.**(a+2)表示第三行第一列的元素
b. *(*a+2)表示第一行第三列的元素
c. a[3][1] 和 d. *(a[3]+1),a[3]越界了,直接排除
19、指针变量p1和p2类型相同,要使p1,p2指向同一个变量,正确的是________。(富士安全)
a. p2=*&p1 b. p2=**p1 c. p2=&p1 d. p2=*p1
a
分析:
a. p2=*&p1,*和&互为逆运算,所以p1=p2
b. p2=**p1,
c. p2=&p1,
d. p2=*p1,
20、下列哪个引用是不正确的? (中维世纪)
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));
D
分析:
A. a[p-a]; p=a;所以a[p-a]=a[0],正确
B. *(&a) ,*和&互为逆运算,所以*(&a)=a,正确
C. p;正确
D. *(*(a+i));未定义i,错误。
21、下面程序的结果是多少? (中科四平)
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
请问:
p1+5=
p2+5=
0x801005 32位计算机0x810014 / 64位计算机0x810028
分析:
p1
和p2
是两个指针变量,它们分别指向了内存地址0x801000
和0x810000
。p1的类型是unsigned char *,p2的类型是unsigned long *。
p1+5
,因为p1
的类型是 unsigned char *,在进行指针加法运算时,会按照 unsigned char 的大小来进行增加。unsigned char 通常占用1个字节,因此p1+5
将会指向0x801000
地址向后偏移5个字节的位置,即0x801005
。
p2+5
,情况稍有不同。由于p2
的类型是unsigned long *,unsigned long的大小取决于编译器和平台,通常是4个字节(在32位系统中)或8个字节(在64位系统中)。这里没有给出具体的平台信息,因此我们无法确定确切的地址偏移量。但如果假设是在32位系统中,p2+5
将会指向0x810000
地址向后偏移5 * sizeof(
unsigned long)
个字节的位置。如果sizeof(
unsigned long)
是4个字节,则p2+5
将会指向0x810000 + 5 * 4 = 0x810014
。如果是64位系统,那么sizeof(
unsigned long)
通常是8个字节,p2+5
将会指向0x810000 + 5 * 8 = 0x810028
。
22、请写出以下程序输出内容。(小端环境) (信雅达)
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);
}
0x4 0x2000000
分析:
int a[4] = {1, 2, 3, 4}; //定义长度4的整型数组a并初始化
int *p1 = (int *)(&a +1); //对数组a取址后加1,再强转
int *p2 = (int *)((char *)a + 1);
printf("0x%x, 0x%x", *(p1-1), *p2);
23、用 C 语言编程,向内存0xff9527地址上存入一个整型数0x123 (宇视科技)