《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分钟出来结果,感觉是越来越少的状态

posted @ 2022-06-07 11:18  就是想学习  阅读(47)  评论(0编辑  收藏  举报