aopeng 发表于 2021-2-22 09:44:22

吉大《c语言程序设计》21春复习指导(七)

吉大《C语言程序设计》FAQ(七)
一、字符数组如何初始化?
        1、对字符数组初始化,最容易理解的方式是逐个字符赋给数组中各元素。如char a={‘r’,‘’,‘g’,‘t’,‘y’};
        2、如果“{}”中提供的初值个数大于数组长度,则作语法错误处理。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余元素自动定为空字符(即 ‘\0’)。
        3、如果提供的初值个数与预定的数组长度相同,在定义时可以省略长度,系统会自动根据初值个数确定数组长度。如: char a[]={‘r’,‘t’,‘y’,‘u’,‘I’};用这种方式可以不必去数字符个数,尤其在赋初值的字符个数较多时,比较方便。
        4、也可以定义和初始化一个二维数组。例:char a={{‘’,‘*’,‘’},{‘*’,‘’,‘*’}}二、为什么?strcat(string, '!')?不行?
答:字符和字符串的区别显而易见, 而?strcat()?用于连接字符串。
C?中的字符用它们的字符集值对应的小整数表示。字符串用字符数组表示; 通常你操作的是字符数组的第一个字符的指针。 二者永远不能混用。要为一个字符串增加?!, 需要使用
        strcat(string, "!");三、在检查一个字符串是否跟某个值匹配,为什么下面语句不行?
char *string; ... if(string == "value") { /* string matches "value" */ ... }
C中的字符串用字符的数组表示, 而?C?语言从来不会把数组作为一个整体操作?(赋值, 比较等)。 上面代码段中的?==?操作符比较的是两个指针?---?指针变量?string?的值和字符串常数?``value"?的指针值 ?---?看它们是否相等, 也就是说, 看它们是否指向同一个位置。它们可能并不相等, 所以比较决不会成功。
要比较两个字符串, 一般使用库函数?strcmp():
        if(strcmp(string, "value") == 0)
{
                /* string matches "value" */
        }四、两个指针可以相减吗?为什么?
如果两个指针向同一个数组,它们就可以相减,其结果为两个指针之间的元素数目。在折半查找的过程中,同样会用到上述减法运算。
如果两个指针不是指向一个数组,它们相减就没有意义。
C本身无法防止非法的指针减法运算,即使其结果可能会给你的程序带来麻烦,C也不会给出任何提示或警告。五、两个指针可以相加吗?为什么?
两个指针是不能相加的。当你试图将一个指针和另外两个指针的差值相加的时候,你很可能会误将其中的两个指针相加,例如,你很可能会使用下述语句:
??p=p+p2-p1;
上述语句是不正确的,因为它和下述语句完全相同:
???   p=(p+p2)-p1;
?? ? 正确的语句应该是:
???   p=p+(p2-p1);
???对此例来说,使用下述语句更好:
???   p+=p2-p1;六、把一个值加到一个指针上意味着什么?
当把一个整型值加到一个指针上后,该指针指向的位置就向前移动了一段距离。就纯粹的内存地址而言,这段距离对应的字节数等于该值和该指针所指向的对象的大小的乘积;但是,就C指针真正的工作机理而言,这段距离对应的元素数等于该整型值。七、NULL总是被定义为0吗?
NULL不是被定义为o,就是被定义为(void *)0,这两种值几乎是相同的。当程序中需要一个指针时(尽管编译程序并不是总能指示什么时候需要一个指针),一个纯粹的零或者一个void指针都能自动被转换成所需的任何类型的指针。八、怎样使用指向函数的指针?
在使用指向函数的指针时,最难的一部分工作是说明该指针。例如,strcmp()函数的说明如下所示:
??int strcmp(const char*,const char*);???
如果你想使指针pf指向strcmp()函数,那么你就要象说明strcmp()函数那样来说明pf,但此时要用*pf代替strcmp:
??int (*pr)(const char*,const char*);
请注意,*pf必须用括号括起来,因为
???int *p{? (constchar? *? ,constchar? *? );??? /*? wrong? */
?等价于
??? (int? *)pr(const char? *,const char? *? );??? /*? wrong? */
?它们都只是说明了一个返回int *类型的函数。
???在说明了pf后,你还要将<string.h>包含进来,并且要把strcmp()函数的地址赋给pf,即:
?    ?? pf=strcmp;
? 或
??    ? pf=Slstrcmp;? /* redundant& */
?此后,你就可以通过间接引用pf来调用strcmp()函数:
??? if(pr(strl,str2)>0)? /*...*/
九、怎样用指向函数的指针作函数的参数?
函数的指针可以作为一个参数传递给另外一个函数,这一点非常有意思。一个函数用函数指针作参数,意味着这个函数的一部分工作需要通过函数指针调用另外的函数来完成,这被称为“回调(callback)”。处理图形用户接口的许多C库函数都用函数指针作参数,因为创建显示风格的工作可以由这些函数本身完成,但确定显示内容的工作需要由应用程序完成。东师作业答案可以联系QQ 761296021
页: [1]
查看完整版本: 吉大《c语言程序设计》21春复习指导(七)