9.9 C语言基础-指针

题目:用变量a给出下面的定义(3C科技、宇视科技,神思电子,中安云科,北京凝思软件)

a) 一个整型数:int a

b) 一个指向整型数的指针:int *a

c) 一个指向指针的的指针,它指向的指针是指向一个整型数:int **a

d) 一个有10个整型数的数组:int a[10]

e) 一个指向有 10个整型数数组的指针:int (*a)[10]

题目:在 int a = 3, int *p = &a;中,*p 的值是( ) (华辰泰尔)

A.变量 a 的地址值;

B.无意义;

C.变量 p 的地址值;

D.3

答案:D

分析:将变量a的地址赋值给指针p,对p解引用操作访问地址所指向的内存空间,即*p=a=3选择D

题目:下列定义中,( )是定义了一个指向数组的指针p。(矩阵软件)

A.int(*p)[7]

B.int *p[7]

C. (int *)p[7]

D. int *p[]

答案:A

分析:A是一个指向数组的指针,指向的数组有7个整型元素组成;B和D是一个指针数组,数组每一个元素是int*型;C表示有歧义

题目:有以下说明语句,则正确的赋值语句是()。(山大华天)

int a[5][5]; int *p, **q;

A. p = a;

B. q = *a;

C. q = a;

D. p = *a;

答案:D

分析:二维数组名a是一维数组指针类型,即int (*)[5]类型,*a得到第一行数组(名),*a表示第一行首元素地址,类型为int*型,所以答案选择D,ABC赋值左右类型都不匹配。

题目:设 char *s1, *s2; 分别指向两个字符串,可以判断字符串 s1 和 s2 是否相等的表达式为( ) (山大华天)

A. s1 = s2

B. s1 == s2

C. strcpy(s1, s2) == 0;

D. strcmp(s1, s2) == 0;

答案:D

分析:对于字符串比较大小,采用strcmp(),库函数,输入参数是两个字符串的起始地址

题目:求 n 的值。n=______。(山东丁一)

int a[20];

char *p1 = (char *)a;

char *p2 = (char *)(a+5);

int n = p2-p1;

答案:20

分析:因为a是数组首元素地址,类型int*,表示访问空间大小为4字节,步长大小也为4字节,所以a+5表示指向a[5]的地址,跨过的步长大小为4*5=20个字节,因为p1和p2指针类型为char*型,步长大小为1字节,所以p2-p1指地址之间所相隔char类型元素的个数,即为20个字节

题目:若有说明int(*p)[3],以下叙述正确的是( ) (杭州快越科技)

A. p是指针数组

B. (*p)[3]和 *p[3]等价

C. p是指向一维数组中任何一个元素的指针

D. p是指向含有3个整形元素的一维数组的指针

答案:D 

分析:int (*p)[3]表示数组指针,指针指向含有3个整型元素的一维数组的指针

题目:设数组a[5]=(10,20,30,40,50],已知指针p指向a[1],则表达式*++p的值是 ( ) (杭州快越科技)

A. 31 B. 30 C. 21 D. 20

答案:B

分析:p指向a[1],对于*++p应是p先++,p指向a[2],再解引用,得到a[2]内容即30

题目:有以下程序段,执行后,mul的值为( ) (杭州快越科技)

int a[] = {1, 3, 5, 7, 9};

int nul, *data, x;

nul=1;

data=&a[1];

for(x=0; x<3; x++)

{

    mul *= *(data+x);

}

printf("%d\n", mul);

A. 945  B. 315  C. 105  D. 15

答案:C

分析:data指针指向a[1],然后进行0-3循环,分别指向a[1],a[2],a[3],mul进行累乘即mul=1*3*5*7=105

题目:在32位计算机系统上,以下代码的输出结果是什么?(泰华智慧)

int *a;

char *b;

char c[20];

printf("%d, %d, %d", sizeof(a),  sizeof(b), sizeof(c));

答案:4,4,20

分析:int *a和char *b都是指针,在32位计算机中,指针所占内存空间大小都为4字节,字符数组有20个元素,每个元素是字符型即1个字节大小,所以数组总大小为1*20=20

题目:有以下定义:(华三外协,紫光云数,山东信通电子,新华三,石峰)

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

分析:p指向数组a的首元素,p+=2指向a的第三个元素,*(p++)先解引用,再p++,所以*p是a[2]的值为3,B选项*++p先p地址加1,再解引用,所以结果是a[3]的值,C选项是a[3]的值,D选项++*p先*p得到a[2]的值即3,再*p自增结果为4

题目:若已定义:int a[6], *p = a, 不能表示 a[1] 地址的表达式是:(云尖软件开发,紫光云数,智洋创新,新华三,石峰)

A. p+1 B. a+1 C. a++ D. ++p

答案:C

分析:p+1、a+1及++p都指向a[1]的地址,a++相当于a=a+1,对于a是地址常量,不能改变,不能进行赋值运算,所以C选项错误表达式

题目:有定义: int x, *p;能使指针变量P指向变量x的语句是:________ (智洋)

A. *p=&x; B. p=&x; C. *p=x; D. p=*&x;

答案:B

分析:&x得到变量x的地址,赋值给指针p,A和C选项因为p定义未初始化,指向随机地址,不能直接进行解引用,D*&x相当于x,整型变量不能赋值给指针

题目:若有说明int a=2, *p=&a, *q=p;则以下非法的赋值语句是( )。 (智洋)

A. p=q B. *p=*q C. a=*q  D. q=a

答案:D

分析:D选项中a是整型变量,q是整型指针,整型变量不能直接赋值给整型指针,非法,ABC,指针赋值指针,两指针解引用后再赋值,指针解引用得到变量再赋值给变量都可以

题目:请写出输出结果 (晟安信息)

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);

}

答案:6,24

分析:p指向数组a的a[0],q指向数组a的a[6],q和p的数据类型都为int*型,表示访问元素空间大小为4字节,步长大小为4字节,q-p表示之间int型元素个数,即为6,(int)q-(int)p表示将地址类型强制转换成int整型数据类型,即地址数值进行相减,表示之间所差字节的个数,即6*4=24

题目:下面的程序输出的结果是__________ (飞音时代)

#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

分析:p指向a的首元素,*p++先*p后赋值给a[i],再p++,循环执行结果就是对a数组元素重新赋值一遍,数组元素的值没有改变,所以a[2]为4

题目:数组声明为:short a[3][4],引用第3行第1列的元素写作________。(富士安全)

a. **(a+2) b. *(*a+2) c. a[3][1] d. *(a[3]+1)

答案:a

分析:a.*(a+2)得到a[2]数组(名),即第3行数组(名),**(a+2)得到第三行第一列元素即a[2][0],B.*a得到第一行数组(名),*(*a+2)得到第一行第三列元素即a[0][2],C.a[3][1]表示第四行第二列元素,D.a[3]表示第四行的数组(名),*(a[3]+1)得到第四行第二列的元素,即a[3][1]

题目:指针变量p1和p2类型相同,要使p1,p2指向同一个变量,正确的是________。(富士安全)

a. p2=*&p1 b. p2=**p1 c. p2=&p1 d. p2=*p1

答案:A

分析:*&p1相当于p1,将p1值赋值给p2相当于p1和p2指向位置相同,因类型也一致,所以则指向同一个变量空间

题目:下列哪个引用是不正确的? (中维世纪)

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+i)得到第i+1的元素,元素类型是int整型变量,不能再进行解引用操作,所以D错误引用

题目:下面程序的结果是多少? (中科四平)

p1=(unsigned char *)0x801000;

p2=(unsigned long *)0x810000;

请问:

p1+5=

p2+5=

答案:p1指针类型是unsigned char*型,表示步长大小为1字节,所以p1+5用地址值表示方式为p1+5=(unsigned char *)0x801005;p2指针类型是unsigned long*型,表示步长大小8字节,所以p1+5在地址值上增加8*5=40个字节,所以p2+5用地址值表示方式为p2+5=(unsigned long *)0x810028

题目:请写出以下程序输出内容。(小端环境) (信雅达)

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表示整个数组地址,&a+1表示跨过整个数组,所以p1指向a数组a[3]后面,由于p1类型int*型,所以p1-1指向a[3]的位置,再解引用得到a[3]的值即4;a为int*型,强制转换成char*型,所以步长大小为1字节,+1表示以a地址起始的第二个字节,所以*p2表示以a地址起始的第二个字节后4个字节的空间,因a[0]=0x00000001,a[1]=0x00000002,在内存中小端存储,所以以a地址起始的后面4个字节分别是00000002,因小端存储,所以读取数据再逆序去读取0x02000000

题目:用 C 语言编程,向内存0xff9527地址上存入一个整型数0x123 (宇视科技)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
	int *p=(int *)0xff9527;
	*p=0x123;//因为p对应的地址未被使用或初始化,直接解引用会非法访问内存,段错误
	printf("%p %#x",p,*p);//???问题未解决
	return 0;
}

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值