暑假第五天之每天一些题系列
一、选择题
-
如下程序:
int a[10]; int*pa; pa = a;
则元素a[1]的地址可以表示为
A. pa+1 B. pa+2 C. pa+4 D. a+2
答案解析:
数字名a是首元素的地址,pa存放的是首元素的地址,pa+1是第二个元素的地址,即a[1]的地址可以表示为pa+1
-
如下程序结果运行结果是
int Change(int *pX) { int y = 8; y = y - *pX; pX = &y; return 0; } int main() { int xx = 3; int *pY = &xx; Change(pY); printf("%d\n", *pY); return 0; }
A. 8 B. 3 C. 5 D. 不确定
答案解析:
指针pY指向xx,将pY的值传给Change,需要注意的是值传递没办法改变外面的值的,故*pY为3
-
下列程序执行后的输出结果是
int main() { char arr[2][4]; strcpy((char*)arr,"you"); strcpy(arr[1],"me"); arr[0][3] = '&'; printf("%s\n",arr); return 0; }
A. you&me B. you C. me D. err
答案解析:
arr是二维数组数组名,数组名是首元素地址首元素是arr[0],所以arr是arr[0]的地址,将"you"拷贝到arr[0]中,然后将me拷贝到arr[1]中,最后将’&'赋给了arr[0][3],刚好在you后面,故打印的arr为you&me
- -27 在内存中的存储形式是以下哪一种
A. 0001 1011 B. 1110 0100 C. 1110 0101 D. 1010 0111
答案解析:
原码:10011011
反码:11100100
补码:11100101
内存中存储的是补码
-
若有以下定义和语句,则选项中错误的语句是
int a = 4,b = 3,*p,*q,*w; p = &a; q = &b; w = q; q = NULL;
A. *q = 0 B. w = p C. *p = a D. *p = *w
答案解析:
q最后赋为NULL了,不能对NULL指针解引用
二、填空题
-
如下代码结果是多少
int fun(int x) { int count = 0; while(x) { count++; x = x & (x-1); } return count; } int main() { printf("fun(2019)=%d\n",fun(2019)); }
答案解析:
该fun函数的功能是求x的二进制有多少个1,x=x&(x-1)是将x的二进制中从右到左第一个1去掉,功能就是统计x的二进制有多少个1,2019的二进制有8个1,故最后输出结果为8
-
以下程序的输出结果为
#define CIR(r) r*r void main() { int a = 1; int b = 2; int t; t = CIR(a + b); printf("%d/n", t); return; }
答案解析:
CIR(a + b)在预处理阶段完成替换,替换为a + b*a + b,代入值得t=5
-
下面的代码中,函数Test执行完毕后,打印的结果是
unsigned long g_ulGlobal = 0; void GlobalInit(unsigned long ulArg) { ulArg = 0x01; return; } void Test() { GlobalInit(g_ulGlobal); printf("%lu", g_ulGlobal); return; }
答案解析:
g_ulGlobal是个全局变量,初始化为0,GlobalInit为传值调用,是不能改变实参的,故打印的是0
三、算法题
题目描述:
有一张单链表,编写函数求倒数第K个结点。
思路:
我们先定义两个指针slow,fast,fast先走k步,然后再一起走,我们看下面的动图:
当fast为NULL时,此时的slow就为倒数第k个结点
需要注意的是:输入的k如果大于结点的个数,fast还没走完k步就变为NULL了,这里要特别返回NULL
代码如下:
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
{
struct ListNode* slow=pListHead;
struct ListNode* fast=pListHead;
if(k==0)
{
return NULL;
}
while(k--)
{
if(fast==NULL)//k大于链表长度时,k没减完fast就走到NULL
{
return NULL;
}
fast=fast->next;
}
while(fast)
{
slow=slow->next;
fast=fast->next;
}
return slow;
}