一些简单的选择题

来源:互联网 发布:表情训练的软件 编辑:程序博客网 时间: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.1 可以看到输出结果是两个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;}

运行结果:图2.2
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;}

运行结果:图2.3
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选项,算是一个好的习惯吧,在使用完过后,我们最好释放掉申请的空间。

0 0
原创粉丝点击