• 《C和指针》学习笔记[第六章 指针]


    1.

    通过定义的值的时候的类型

    2.

    因为定义字面值指针常量没有意义,而且也无法确认该块区块无其它数据使用。

    3.

    值是值,值表示该地址空间类型所代表的值,需要解释为指针地址,需要特殊的&符去像变量获取地址

    4.

    后果为将会读取或者修改该地址的值,可能会引起整个程序的错误

    5.

    我感觉没啥区别

    6.

    有两个错误。对增值后的指针进行解引用时,数组的第一个元素并没有被清零。另外,指针在越过数组的右边界以后仍然进行解引用,还对齐进行了内容清零。

    6.18编程练习:

    1.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>
    
    char *find_char(char const *source, char const *chars){
    
        int i, j;
        for (i = 0; *(source + i) != '\0'; i++) {
            for (j= 0; *(chars + j) != '\0'; j++) {
                if (*(source + i) == *(chars + j)) {
                    return (char *) (source + i);
                }
            }
        }
        return NULL;
    }
    
    
    
    int main(void)
    {
        char str1[] = "hello";
        char str2[] = "ll";
        
        char *res;
        
        res = find_char(str1, str2);
        if (res) {
            printf("%s\n", res);
        }
        else
            printf("no find\n");
        
        return EXIT_SUCCESS;
    }

    2.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>
    
    int del_substr(char *str, char const *subchars){
        
        if (*subchars == '\0') {
            return 1;
        }
    
        int i = 0, j = 0;
        for (i = 0; *(str + i) != '\0'; i++) {
            for (j = 0; *(subchars + j) != '\0';) {
                if ( *(str + i) == *(subchars + j) ) {
                    i++;
                    j++;
                }
                else
                    break;
                if (*(subchars + j) == '\0') {
                    goto TWO;
                }
            }
        }
        
        return 0;
        
    TWO:
    //    printf("%d, %d", i, j);
        for ( ; *(str + i) != '\0'; i++) {
            str[ i -j ] = str[i];
        }
        str[ i -j ] = '\0';
        return 1;
    }
    
    
    
    int main(void)
    {
        char str1[] = "hello world";
        char str2[] = "world";
        
        int res;
        
        res = del_substr(str1, str2);
        if (res) {
            printf("%s\n", str1);
        }
        else
            printf("no find\n");
        
        return EXIT_SUCCESS;
    }

    3.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>
    
    void reverse_string(char *string){
        char tmp;
        int start, end;
        start = 0;
        end = strlen(string);
        
        while (start < end) {
            tmp = *(string + start);
            *(string + start) = *(string + end - 1);
            *(string + end - 1) = tmp;
            start++;
            end--;
        }
    }
    
    
    
    int main(void)
    {
        char str1[] = "12";
        char str2[] = "w";
        
        
        reverse_string(str1);
        
        printf("%s\n", str1);
    
        
        return EXIT_SUCCESS;
    }

     4.网上

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>
    
    
    #define TRUE '1'
    #define FALSE '0'
    
    #define SIZE 1000
    
    int main(void)
    {
        char num[SIZE];
        int  index = 0;
        int  temp;
    
        // 赋初值
        for(; index < SIZE; index++ )
        {
        num[index] = TRUE;
        }
        
        // 对所有的元素进行测试
        for( index = 2; index < SIZE + 2; index++ )
        {
            if ( num[index - 2] == TRUE ) {
              
            for(temp = index+1; temp <= SIZE + 2; temp++ )
              {
                    if( num[temp -2] == TRUE && temp % index == 0 )
                    {
                      num[temp - 2] = FALSE;
                    }
              }
           }
        }
    
        // 输出
        int number = 0;
        for( index = 0; index < SIZE; index++)
        {
            if( num[index] == TRUE )
                {
                  if( number % 5 == 0) printf( "\n" );
                  printf("%d\t", index + 2 );
                  number++;
                }
        }
        printf("\n");
    
        return EXIT_SUCCESS;
    }

    5.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>
    
    
    #define SIZE 1000
    #define MAX_VALUE (SIZE * CHAR_BIT)
    
    /*
      对字符数组的位操作
    */
    unsigned bit_offset( unsigned bit_number )
    {
      return bit_number % CHAR_BIT;
    }
    
    unsigned character_offset ( unsigned bit_number )
    {
      return bit_number / CHAR_BIT;
    }
    
    // 测试指定位为1还是为0
    int test_bit( char bit_array[], unsigned int bit_number )
    {
      return ( bit_array[ character_offset( bit_number ) ] & 1 << bit_offset( bit_number )) != 0;
    }
    
    
    //清零
    void clear_bit( char bit_array[], unsigned int bit_number )
    {
      bit_array[ character_offset( bit_number )] &= ~(1 << bit_offset( bit_number ));
    }
    
    
    
    int main(void)
    {
        // 定义SIZE数量字节的数组
        char sieve[ SIZE ];
        
        // 初始化所有的位为1
        for( int i = 0 ; i < SIZE ; i++)
            sieve[i] = 0xff;
        
        // 对所有的位进行判断 起始位从数值2开始
        for( int number = 2; number < MAX_VALUE + 2; number++ )
            {
                // 测试指定位是否为质数
                if (test_bit(sieve, number-2)) {
                    for (int j = number + 1; j < MAX_VALUE + 2; j++) {
                        if (test_bit(sieve, j-2) && j % number == 0) {
                            clear_bit(sieve, j-2);
                        }
                    }
                }
            }
    
    
        
        for(int i = 0; i < MAX_VALUE; i++ )
            {
            if( test_bit( sieve, i ))
                printf("%d\t", i + 2);
            }
        
        putchar('\n');
        
        return EXIT_SUCCESS;
    }

    7993

    6.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>
    
    
    #define TRUE '1'
    #define FALSE '0'
    
    #define SIZE 1000000
    
    int main(void)
    {
        char num[SIZE];
        int  index = 0;
        int  temp;
    
        // 赋初值
        for(; index < SIZE; index++ )
        {
        num[index] = TRUE;
        }
        
        // 对所有的元素进行测试
        for( index = 2; index < SIZE + 2; index++ )
        {
            if ( num[index - 2] == TRUE ) {
              
            for(temp = index+1; temp <= SIZE + 2; temp++ )
              {
                    if( num[temp -2] == TRUE && temp % index == 0 )
                    {
                      num[temp - 2] = FALSE;
                    }
              }
           }
        }
    
        // 输出
        int number = 0;
        for( index = 0; index < SIZE; index++)
        {
            if( num[index] == TRUE )
                {
                  number++;
                }
            if ((index+2) % 1000 == 0) {
                printf("index <= %d\t, number=%d\n", index+2, number);
                number = 0;
            }
            
        }
        printf("\n");
    
        return EXIT_SUCCESS;
    }

    我的电脑跑了3分钟出来结果,感觉是越来越少的状态

  • 相关阅读:
    VMWARE虚拟机提示 "您正在运行的此虚拟机已启用侧通道缓解。侧通道缓解可增强安全性,但也会降低性能""
    appSettings 配置节中不存在项"formldStr"
    PVC圆管直接跑MPS计划需求单的部件材料用量为空
    [转]Linux安装tomcat
    mysql磁盘满
    Linux开机自启动
    mysql主从配置
    tar解压与压缩
    ubuntu中的root用户
    mysql二进制日志
  • 原文地址:https://www.cnblogs.com/sidianok/p/16351116.html
Copyright © 2020-2023  润新知