出了几道C语言的题,考查各位内功,邀请各位一做
1. 有以下程序片段:
int a[] = { 1, 2 };
int *p = a;
问:
当sizeof(int) = 4时,
sizeof(a)=?
sizeof(p)=?
分别为什么?
2. 以下循环是死循环吗?
for (int i = 1; i > 0; i++)
printf("%d\n", i);
为什么?
3. 有以下程序片段:
int a[] = { 1, 2 };
int i = 5;
printf("%d\n", a[-1]);
输出结果可能是什么?
4. 有以下程序片段:
int i = 5;
int a[] = { 1, 2 };
printf("%d\n", a[3]);
输出结果可能是什么?
5. 有以下程序片段:
int array[ARRAY_SIZE];
int *pi;
for (pi = &array[0]; pi < &array[ARRAY_SIZE];)
*++pi = 0;
(1)修改for (pi = &array[0]; pi < &array[ARRAY_SIZE];)这一行,改为等价程序。
(2)谈谈这个程序可能运行结果。
(3)小明说这个程序如果后来pi被设置为空指针的话,会导致死循环,还会破坏N多数据。你同意小明的观点吗?如果之后pi真的变成空指针的话,那一般在Windows/Linux下这个程序会是死循环吗?不是的话会发生什么?
6. 有一个函数如下:
char *strcpy(char *dest, const char *src)
{
char *temp = dest;
if (dest == src)
return dest;
if (dest == NULL || src == NULL)
return NULL;
while (*dest++ = *src++)
;
return temp;
}
小明说如果把if (dest == NULL || src == NULL) return NULL;改为if (dest != NULL || src != NULL)就可以巧妙地利用顺序结构的特点简化掉一个return NULL;,你同意他的做法吗?
7. 有这样一个程序:
#include <stdio.h>
void foo (void)
{
int i;
printf("%d\n", i);
i = 999;
}
int main (void)
{
foo();
foo();
return 0;
}
运行结果可能为什么?为什么?在foo();之间加个printf("hello\n");呢?
8. 某人为了给学生讲讲什么是指针写了如下程序:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[5] = { 1, 2, 3, 4, 5 };
unsigned int p;
}
程序还没写完,请把p当作指针用它来遍历数组a,输出数组a的所有元素。
写完后思考一下,不用unsigned int用int行不行?为什么?