填空:
1,short int a[10]={123, 456, 789}; sizeof(a)= 20 ;short int *p=&a, 则sizeof(p)=
对于64位机来说,指针为8字节表示。其中
sizeof是一运算符,返回编译器为其分配的数组空间大小,不关心里面存了多少数据,sizeof几种情况:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度, 是长整型);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能 是void。
strlen是一函数,只接受char*类型变量,返回字符串的实际长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符'\0',返回的长度大小不包括'\0'。
详细参考:strlen和sizeof的区别
2,给一整形变量n(32bit),把n的bit5(bit0开始)置1,其他不变:n |= (1<<5)
位操作之中时常用到与(&),或异(^),或(|),其中:
(1)与1相异或(^)运算将取反
(2)与1相或(|)运算将被置1
(3)与1相与(&)运算将保持不变
(4)取反运算符~,将数0-->1,1-->0
(5)右移(>>) 左移(<<)
3,int fun(int* x, int *y){……} 则:怎么用函数指针p调用fun?
void main()
{ int a=1,
b=2;
int
(*p)(int *, int *);
p=fun; p(&a, &b);
}
函数指针,本质是指针,表示为 int (*p)(int *, int *)
指针函数,本质是函数,表示为 int *p(int *, int *)
4,定义一个宏,将内存的大小由MB转换为bit:#define
MB_TO_BIT(x) ((x)*1024*1024)ul
5,如图,p,q节点指向,插入q,则:
viod add(node* head, int a) { … node *p = head->next; node *q = (node *)malloc(sizeof(node)); q->data = a; q->next = p->next; p->next=q; }
技巧是不能够把p和后一节点先断开,否则将不能寻找到后一节点。
6,由char a=253; int b = a; int c = a&0xff; 则:b=-3 , c= ;
其中:a为有符号数,最高位是1,余下7位,范围-128~127,253表示为-3
7,用define实现,将整数x,y连接形成整数并除以y,如:F(12, 34, 56) = 1234/56,则:#define F(x,y,z) ((x)##(y)/(z));
注意:宏之中’#’ ‘##’区别,
(1)‘#’是把宏参数转换为字符串,如:
#define PSQR(x) printf(“ ”#x”=%d\n ”, ((x)*(x)))
则 y=5,PSQR(y)将输出 y=25;
x=2+4, PSQR(x)将输出 2+4=36
(2)’##’粘合剂,如:
#define XNAME(n) x##(n) 则
XNAME(4)将表示为 x4
选择:
1,找不正确选择(A)
A, char a[8]={‘a’,’b’,’c’,} B, char a[8]; a=”hello”;
C, char a[]=”abc”; D, char a[8]={’a’,’b’,’c’,’\0’};
2,#define M(x, y, z) x*y+z, 则a=1, b=2, c=3结果输出
M(a+b, b+c, c+a)= (D)
A, 19 B,17 C,15 D,12
宏只是简单的替换,不会计算出a+b, b+c, c+a中的结果。所以M(a+b, b+c, c+a)=1+2*2+3+3+1。
需要改进为:#define M(x, y, z) ((x)*(y)+(z))
3,由char aa=500; int bb=aa;则 printf(“%d\n”, bb+1)的结果(C)
A, 编译报错 B,245 C,-11 D,-1
由于char类型表示范围为-128~127,所以aa值为-12,所以bb+1=-11
4,char a[] = {’i’, ’n’, ’n’, ’\0’, ’s’}; char b[] = {’i’, ’n’, ’n’, ’s’ ,’\0’};
int x1=sizeof(a), int x2=strlen(a), int x3=sizeof(b), int x4=strlen(b)
问:X1= X2= X3= X4= ;(A)
A,5 3 5 4 B,5 5 5 5 C,5 5 6 5 D,3 3 5 5
sizeof计算出编译器为数组分配内存大小,strlen接受char*类型变量,遇到’\0’结束,计算数据实际存储的数据。
详细参考:strlen和sizeof的区别
5,函数递归,求f(2, 3)= D
int f(int x, int y) { if(x==) return y+; if(y==) return f(x-, ); return f(x-, f(x, y-)); }
A,4 B,16 C, 31 D,61
5, 下列程序可能运行结果()(多选)
#include <stdio.h>
#include <unistd.h>
int main (int argc, char **argv)
{
int cnt=;
pid_t pid; if((pid=fork())==)
cnt++;
else
cnt--;
printf("\n%d\n", cnt); return ;
} /* ----- End of main() ----- */
A,3 B,31 C,1 D,13
结果:A和C
简答:
1,用c变函数,实现一个字符高低位互换,比如0x3A-->0xA3
char change (char num)
{ char temp=num; temp &= 0x0f; temp = temp<<; num &= 0xf0; num = num>>; temp = (num|temp); return temp; } /* ----- End of change() ----- */
2,字符逆序存储,如abcdefgh->hgfedcba
char *reverse (char *s)
{
char *head = s;
char *end = s;
/*end定位到字符串尾*/
#if 1
while (*(end + ) != '\0')
++end ;
#else
while( *end )
++end;
end--;
#endif while(end > head)
{
char temp=*head;
*head++ = *end;
*end-- = temp;
} return s;
} /* ----- End of reverse() ----- */
详细参考:字符串面试题(一)字符串逆序
3,字符串s,t, 将t插入s,其中假设s有足够空间容纳t
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100 int insert_pos (char *src, char *dst, int pos)
{ char temp[MAX];
int loc=stlren(src); if(pos < )
{
printf("position needs to big than or equal to 0\n");
return -;
}
/* 插入位置超过被插字节串长度 */
if(loc<=pos)
{
strcat(src, dst);
}
/*正常插入字符串中间*/
else
{
memset(temp, , );
strcpy(temp, src+pos);
strcpy(src+pos, dst);
strcat(src, temp);
} return ; } /* ----- End of insert_pos() ----- */ int main (int argc, char **argv)
{
char a[]="abghij";
char b[]="cdef";
int pos; printf("position:\n");
scanf("%d", &pos); if( -==insert_pos(a, b, -) )
return -;
printf("%s\n", a); return ;
} /* ----- End of main() ----- */
4,单链表L,头指针为phead,判断其是否有环?
bool isExitsLoop(list *head)
{
list *slow = head, *fast = head; while ( fast && fast->next )
{
slow = slow->next;
fast = fast->next->next;
if ( slow == fast ) break;
} return !(fast == NULL || fast->next == NULL);
}
详细参考:判断单链表是否存在环及求环入口点