一些简单的选择题
来源:互联网 发布:表情训练的软件 编辑:程序博客网 时间:2024/05/16 01:32
1、逗号运算符
那是一个关于逗号运算符的题,原题就不赘述了,根据我自己的理解,我写了以下一个程序:
int main(){ int x, y, z, z2, z3, z4; x = y = 1; z = x++, y++, y++; x = y = 1; z2 = (x++, y++, y++); x = y = 1; z3 = ++x, y++, y++; x = y = 1; z4 = (x++, y++, ++y); printf("%d %d %d %d\n", z, z2, z3, z4); return 0;}
以上程序的运行结果是什么呢?你可以先自己想一想。
答案是:1 2 2 3,那么答案是怎么来的呢?这四个输入结果之间的差别就是有无括号和x++,++x的区别。有括号:依次运算,取最后一个表达式的结果;无括号:取第一个表达式的结果;而且对于x++,y++来说,是先赋值给z再进行运算;++x则是先运算再赋值,所以有这样的结果
2、向函数传递指针的一些问题
题目如下:
#include <string.h>#include <stdio.h> #include <stdlib.h> void getmemory(char *p){ p = (char *)malloc(100); strcpy(p, "hello world");}int main(){ char *str = NULL; getmemory(str); printf("%s\n", str); free(str); return 0;}
那么对于这个程序的输出结果是什么呢?正常输出“hello world”还是输出为空,或者“烫烫烫”呢?甚至是直接崩溃?想不出来的朋友可以复制这段代码跑一下,结果我们发现,输出为空,在VC中显示的是(null)。这就要说到向函数传递指针时应当注意的几个问题了,我们用类似的例子来说明这个问题:
2.1 直接传递指针
当我们把一个指针作为参数传给一个函数的时候,其实只是把指针的副本传递了过去,也可以说传递指针是指针的按值传递。
如果我们在函数内部修改指针会出现问题,在方法里做修改只是修改指针的副本而不是指针本身,原来的指针还保留着原来的值,我们用以下代码来说明一下:
int val = 1;void fun(int *p){ p = &val;}int main(){ int n = 2; int *pn = &n; printf("%d\n", *pn); fun(pn); printf("%d\n", *pn); return 0;}
我们来看一下输出结果: 可以看到输出结果是两个2,并没有被改变。
2.2 使用二级指针
使用二级指针可以达到目的,代码如下:
int val = 1;void fun(int **p){ *p = &val;}int main(){ int n = 2; int *pn = &n; printf(" %d\n", *pn); fun(&pn); printf(" %d\n", *pn); return 0;}
运行结果:
p:是一个指针的指针,对它不做处理,否则会丢失它指向的指针的地址。
*p:是被存放原指针的地址,如果我们修改它,修改的是被指向的指针的内容。这样,我们就可以修改main函数里面*pn指向的内容。
2.3 指针的引用
再来一段指针的引用的代码:
int val = 1;void fun(int *&p){ p = &val;}int main(){ int n = 2; int *pn = &n; printf(" %d\n", *pn); fun(pn); printf(" %d\n", *pn); return 0;}
运行结果:
p:是指针的引用,引用的是main里面的*pn;
*p:很显然就是main里面的*pn指向的内容。
3、字符串的一点点东西
直接上题:
(多项选择)请找出下面代码中的所有错误。说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”。
#include<stdio.h>#include<string.h>#include<stdlib.h>int main() { char *src = "hello,world"; char *dest = NULL; int len = strlen(src); dest = (char *)malloc(len); char *d = dest; char *s = src[len]; while (len-- != 0) d++ = s--; printf("%s", dest); return 0; }
A.第7行要为’\0’分配一个空间
B.第9行改成char * s = &src[len-1]
C.第12行前要加上*d = ‘\0’
D.第13行前要加上free(dest)释放空间
该题的答案是ABCD。
A选项,在生成字符串的时候,系统是自动在末尾补上’\0’,代表结束的,但是我们通过str(len)测出来的长度,是不包括这个的,所以,只分配这么多的空间是不可以的,还要为’\0’分配一个。
B选项,src[len]是一个char类型,而不是char*,所以直接赋值时不可以的,我们要加上取地址符。
C选项,和A选项一样,在赋值过去过后,要在最后补一个’\0’,代表结束。
D选项,算是一个好的习惯吧,在使用完过后,我们最好释放掉申请的空间。
- 一些简单的选择题
- 一道简单的C#选择题
- 一些容易混淆的Java选择题
- 牛客网Java选择题的一些整理
- 有关Visual C++的一些选择题及答案
- 有关Visual C++的一些选择题及答案
- 编写一个简单的程序,用于校对选择题答案
- SCJP的一道选择题
- 哎,人生的选择题
- 关于排序的选择题
- java的笔试选择题
- 成本计算的一道选择题
- 选择题的简易判断
- 选择题
- 选择题
- 选择题
- C和指针一些笔试中的选择题
- 【web前端】仅使用JS做简单的选择题测评系统
- GLSL实现滤镜效果
- 安卓开发——问题:ListView点击事件失效(descendantFocusability)
- 关于“时间”的一次探索 关于js时区iso,utc等完美解答
- 五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程
- Xcode 静态库调试策略
- 一些简单的选择题
- HDU-1062-Text Reverse
- ios开发——定时任务
- Android:android.database.sqlite.SQLiteConstraintException:UNIQUE constraint failed
- Android NDK——Log
- Android代码内存优化建议-Android资源篇
- canvas 动画制作——时钟
- 100层楼摔鸡蛋问题
- 设备未就绪异常