2016.11.01 - 2016.11.07 笔记

来源:互联网 发布:什么数据库好用 编辑:程序博客网 时间:2024/04/28 12:26
1:以下代码中的两个sizeof用法有问题吗?void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母{    for ( size_t i = 0; i < sizeof(str) / sizeof(str[0]); ++i )        if ( 'a' <= str && str <= 'z' )            str -= ('a' - 'A' );}char str[] = "aBcDe";cout < < "str字符长度为: " < < sizeof(str) / sizeof(str[0]) < < endl;UpperCase( str );cout < < str < < endl;//函数内,外的都有问题
例2:int x[6][4],(*p)[4]; p=x;   则*(p+2)指向哪里?//x[2][0]下面程序的输出结果是#include<iosteam.h>void main(){    int n[][3] = {10,20,30,40,50,60};    int (*p)[3];    p=n;    cout<<p[0][0]<<","<<*(p[0]+1)<<(*p)[2]<<endl;}//int (*p)[3];这里首先确定:p是一个指针,一个指向数组的指针。p = &(p[0])       p是二维指针p[0] = &(p[0][0]) p[0]是一维指针p[0] + 1表示在列上移动。  e.g:  p[0] + 1 = &p[0][0] + 1 = &p[0][1]p + 1   表示在行上移动。  e.g: p + 1 = &(p[0]) + 1 = &p[1]因此:*(p[0]+1) = p[0][1] = 20(*p)[2] = p[0][2] = 30
给定程序中,函数fun的功能是:将形参给定的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中逐个读入并显示在终端屏幕上。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 试题程序:void fun (char *s, int a, double f){    /**********found**********/    1 * fp;    char ch; &    fp = fopen("filel.txt", "w");    fprintf (fp, "% S % d %f\n", % '%', f);    fclose(fp);    fp = fopen("filel.txt", "r");    printf("\nThe result:\n\n");    ch = fgetc(fp);    /**********found**********/    while (!feof ( 2 ))    {        /**********found**********/        putchar( 3 );        ch = fgetc(fp);        putchar('\n');        }    fclose(fp);}int main( ){    char a[10] = "hello!";     int b = 12345;    double c = 98.76;    fun(a, b, c);}1参考答案 FILE2参考答案 fp3参考答案 ch
//例4:32位机器上,有如下代码:char array[] = "abcdefg";printf("%d\n", sizeof(array));char *p = "abcdefg";printf("%d\n", sizeof(p));void func(char p[10])  {    printf("%d\n", sizeof(p));   }void func(char (& p)[10])  {    printf("%d\n", sizeof(p));      }int main(void)  {    printf("%d\n", sizeof(char[2]));    printf("%d\n", sizeof(char &));    return 0;   }1 chararray[] ="abcdefg";printf("%d\n",sizeof(array)); 主要是考虑后面还有一个\0;2 char*p ="abcdefg";printf("%d\n",sizeof(p));p是一个指针。3 voidfunc(charp[10]){    printf("%d\n",sizeof(p));}主要考虑的是数组当做参数时退化为指针,故传入的p任然是原指针p的拷贝,也是一个指针4voidfunc(char(& p)[10]){    printf("%d\n",sizeof(p));}p是装10char类型数据的数组的引用,其结果类似于char p[10];printf("%d\n",sizeof(p));5    printf("%d\n",sizeof(char[2]));printf("%d\n",sizeof(char&));//sizeof(char&): 对引用类型执行sizeof运算得到被引用对象所占空间的大小。【C++ Primer4.9】
5:如下程序用于输出“Welcome to Huawei Test”,请指出其中的两处错误。char * GetWelcome(void){    char * pcWelcome;    char * pcNewWelcome;    pcWelcome="Welcome to Huawei Test";    pcNewWelcome=(char *)malloc(strlen(pcWelcome));    //1    if(NULL==pcNewWelcome){        return NULL;        //2    }    strcpy(pcNewWelcome, pcWelcome);    //3    return pcNewWelcome;            //4}1是错的 ,应该是strlen(pcWelcome)+13 由于 strlen(pcWelcome)+1改了之后 , pcNewWelcome所指的空间可以放下pcWelcome所指的内容了,也是对的4 pcNewWelcome指针是在函数内部定义的,在栈上分配的,函数调用结束后,会释放这个指针变量本身,但其所指向的内存仍然存在  
6:void swap_int(int *a,int *b){  *a=*a+*b;  *b=*a-*b;  *a=*a-*b;}以下说法正确的是:举个例子:交换-5, -7。 以4bit为例。-5 = 1011 (补码)    -7 = 1001 (补码)(-5)+ (-7)= 10100=0100=4 (溢出后为44-(-7)= 4 +7=0100 + 0111 = 1011 = -5的补码4-(-5)= 4 + 5 = 0100 + 0101 = 1001 = -7的补码设整形变量*a*b的位表示为*a = n31n30 ··· n0*b = m31m30 ··· m0只有当*a > 0 && *b > 0*a < 0 && *b < 0时才会发生溢出。两者类似,只证明均大于0时的情况。必须扩展额外一位才能够容纳正确的结果,'|'左边为扩展位。*a = 0|0n30 ··· n0 = n30*230 +  n29*229 + ··· + n0*20 = N*b = 0|0m30 ··· m0 = m30*230 +  m29*229 + ··· + m0*20 = M若和溢出,则33位表示必为*a + *b = 0|1b30 ··· b0 = -231 + b30*230 +  b29*229 + ··· + b0*20 =  2 31  + B ① 计算机将得到的33位结果truncate回原来的32位,即丢弃第33位(0)变为:*a + *b =    1b30 ··· b0 = -231 + b30*230 +  b29*229 + ··· + b0*20 = -2  31   + B ②正确的真实值是①,溢出结果为②,可见溢出结果=真实值-2 32*b = *a - *b = ② - *b =  ① - 232 - *b = *a + *b - 232 - *b = -232 + *a最后一步,来看 -232 + *a  == *a 成立否?0 < *a < 231, 则 -232 < -232 + *a < -231,和仍需要扩展1位方能表示:*a    = 0|0n30 ··· n0 = n30*230 +  n29*229 + ··· + n0*20 = N-232 = 1|0000 ··· 00 和的位表示为-232 + *a = 1|0n30 ··· n0 = n30*230 +  n29*229 + ··· + n0*20同样,计算机把33位结果truncate32位(丢弃第33位)得到:-232 + *a =  0n30 ··· n0 = n30*230 +  n29*229 + ··· + n0*20 = *a可见-232 + *a  == *a 是成立的。因此尽管溢出了,但仍能正确交换。
0 0