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