嵌入式笔试面试题(7)---指针与数组

1、请解释“func”为何种类型,这种类型的作用什么,变量ttt 的值是多少?

typedef int (*func)(int, int*);//函数指针------回调函数-----7

int xxx(int a, int *p)

{

       return a + *p;

}

int dowork(func aaa, int bbb, int *ccc)

{

       return aaa(bbb, ccc);

}

int sss = 4;

int ttt = dowork(&xxx, 3, &sss);

2、若有定义inta[3][3],有哪几种方式可以表示a[1][1]。

*(&a[0][0]+4)

*(*(a+1)+1)

*(a[1]+1)

3、用变量a给出下面的定义

a) 一个整型数(An integer)    int a;

b) 一个指向整型数的指针(A pointer to an integer) int *a;

c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) int **a;

d) 一个有10个整型数的数组(An array of 10 integers) int a[10];

e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers) int *a[10];

f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers) int (*a)[10];

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)

Int (*fun)(int );

h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )int (*a[10])(int );

4、 int a=12; int*p,*q,*r;

p=&a;

r=p+1;

q=p++;

printf(“%2d%2d\n”,q-p,r-p);

printf(“%5d\n”,(char*)p-(char*)q);

 输出结果是多少?-1,0,4

5、下面程序执行的结果?为什么会是这个结果?

int main()

{

char a[1000];

int i;

for(i = 0; i < 1000; i++)

{

a[i] = -1-i;

}

printf(“%d\n”, strlen(a));

return 0;

}255

快速求补码:从右到左找到第一个不为0的位,从这个位开始(不包含这个位),从右到左前面的位0变1,1变0,不包含符号位。     

i=0 a[i]=-1;     原码:0x1000 0001   补码:0x1111 1111

i=1 a[i]=-2;     原码:0x1000 0010   补码:0x1111 1110

i=2 a[i]=-3;     原码:0x1000 0011   补码:0x1111 1101

i=127 a[i]=-128; 原码:0x11000 0000  补码:0x11000 0000

i=128 a[i]=-129; 原码:0x11000 0001  补码:0x10111 1111

i=129 a[i]=-130; 原码:0x11000 0010  补码:0x10111 1110

i=254 a[i]=-255; 原码:0x11111 1111  补码:0x10000 0001

i=255 a[i]=-256; 原码:0x110000 0000  补码:0x110000 0000

6、Int main{

Char a[5] = {‘A’,’B’,’C’,’D’};

Char (*p1)[5] = &a;指向整个数组的指针

Char (*p2)[5] = a;指向单个字符的指针

Return 0;

}

问题: 1.p1和p2 的使用,哪个正确?

2、P1+1的值会是什么? P2+1的值是什么?

7、请问下面程序有什么错误?

int a[60][250][1000],i,j,k;

for(k=0;k<=1000;k++)

for(j=0;j<250;j++)

for(i=0;i<60;i++)

a[i][j][k]=0;

交换最内层和最外层的for循环的顺序,减少程序的执行的次数,节省资源

8、数组定义为“ int a [ 4 ] ; ”,表达式 ( ) 是错误的。
A.*a
B.a [ 0 ]
C.a
D.a++ 常量不能自增

9、打印一个N*N的方阵,N为每边字符的个数( 3〈N〈20 ),要求最外层为“X”,第二层为“Y”,从第三层起每层依次打印数字0,1,2,3,...
例子:当N =5,打印出下面的图形:
X X X X X
X Y Y Y X
X Y 0 Y X
X Y Y Y X
X X X X X

10、已知一个数组table,用一个宏定义,求出数据的元素个数。

#define NUM(a)  while(*a != ‘\0’) count++;

#define NUM   (sizeof(table)/sizeof(table[0]))

11、若定义:int a[2][3]= {0,2,4,6,8,10},以下说法正确的是:

A、*(a + 1)为元素6的地址

B、*(a[1] + 1)的值为2

C、a[0]与a相同

D、**(a+1)+2的值为8

E、a[1][2]的值为10

12、用函数指针实现a,b中取最大值

13、函数指针有什么作用  

函数指针本质上就是一个指针,这个指针带返回值和参数类型,指针指向一个函数入口地址,c语言中,函数名就是函数的入口地址;函数指针也是一种数据类型:int (*func)(int ,int );

14、指针在任何情况下都可以进行> ,< ,<=,>=,==运算,这句话对不对?

指针是一个特殊的变量,它里面存储的数值被解释为内存里的一个地址,可看成一个无符号整型变量,如果是指针比较就可看成整型变量比较,是可以比较的,关键看比较是否有意义;

(1)不同类型的指针不强制转换没有意义;

(2)没有意义的指针(没初始化的指针)没有意义;

(3)一般在不同存储区域(栈、堆、静态区)没有意义;

15、设int arr[] = {6,7,8,9,10}

Int *ptr = arr;

*(ptr++)+ = 23;

*ptr =? *(++)ptr = ?//8   8

 

17、下列程序的运行结果是(  )  

main( ) 
{ int a[3][4]={1,3,5,7,9,11,13,1517,19,21,23};

int (*p)[4],i=2,j=1;

p=a;

printf(″%d\n″,*(*(p+i)+j));


A.9      B.11        C.17         D.19

 

18、  Char* pa[3] = {“ABC”,”DEF”,”GHI”};

Char** p = pa;

p ++;

printf(“%s\n”,p);

打印结果是什么?

打印结果为乱码,如果是printf(“%s\n”,*p);打印为DEF;如果是printf(“%c\n”,**p);打印为D;

19、int a[5]; 假设a的首地址是0xff15;

a+1    &a+1   &(a+1)      sizeof(a)/sizeof(int)

0xff19     0xff29     0xff19         5

猜你喜欢

转载自blog.csdn.net/xt18971492243/article/details/79371885