zoukankan      html  css  js  c++  java
  • 指针3

    28.1 输入任意个整数后一起印出

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 int main() {
     5     int numbers[10];  // 储存输入的数字
     6     int length = 0;   // 目前已经输入的数字个数
     7     while (length < 10) {    // 如果输入个数满 10 个就结束
     8         int input;
     9         scanf("%d", &input); // 从键盘输入数字
    10         if (input == 0) break;
    11         numbers[length] = input;
    12         length++;
    13     }
    14 
    15     printf("Numbers: ");
    16     for (int i = 0; i < length; i++) {
    17         printf("%d", numbers[i]);
    18     }
    19     printf("
    ");
    20     return 0;
    21 }


    28.3 用同一个指标指向不同的阵列

     1 #include <stdio.h>
     2 
     3 int main() {
     4     int i;
     5     int* numbers;
     6     int length = 0;
     7 
     8     int larger1[1] = {1};
     9     numbers = larger1;
    10     length++;
    11     for (int i = 0; i < length; i++) {
    12         printf("%d ", numbers[i]); // 等同于 printf("%d ", larger[i]);
    13     }
    14     printf("
    ");
    15 
    16     int larger2[2] = {2, 3};
    17     numbers = larger2;
    18     length++;
    19     for (int i = 0; i < length; i++) {
    20         printf("%d ", numbers[i]);  // 等同于 printf("%d ", larger2[i]);
    21     }
    22     printf("
    ");
    23     return 0;
    24 }

    这个程序发生了未定义行为

    28.5 使用自动变数所遇到的问题

    28.6 动态配置记忆体

    
    

     28.7 释放动态配置的记忆体

    题目:请使用者可以输入任意个数整数后,将所有输入的整数一起印出(输入0表示结束)

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int * numbers = 0; // 0 表示空指标 (NULL)
        int length = 0;    // 目前已经输入的数字个数
    
        while  (1) {
            int input;
            scanf("%d", &input);   // 从键盘输入数字
            if (input == 0) break;
            int* larger = malloc(sizeof(int) * (length + 1));  // 产生一个大一格的新阵列
            for (int i = 0; i < length; i++) larger[i] = numbers[i]; // 复制旧阵列到新阵列
            free(numbers);  // 释放
            numbers = larger;     // 将 numbers 设为刚产生的新阵列
            numbers[length] = input; // 将输入数字加在后面
            length++;                 // 将已输入的数字个数加 1
        }
        printf("Numbers: ");
        for (int i = 0; i < length; i++) {
            printf("%d ", numbers[i]);
        }
        printf("
    ");
        return 0;
    }

    28.8 重新配置记忆体

    使用realloc函式重新配置记忆体大小

    • <stdlib.b>提供realloc函式复制记忆体内容

        void* realloc(void* ptr, size_t size);

    1. ptr是要重新配置的记忆体空间开头位址

         原本由 malloc 或其他动态记忆体配置函式所配置

    • size 是重新配置后的记忆体空间大小(单位为位元组)
    • 回传值为重新配置后的记忆体空间开头位址

    30.2 练习:使用指标阵列在函式间传递二维阵列

    #include <stdio.h>
    
    void print(int **v, int height, int width) {
        int i, j;
        for (i = 0; i < height; i++) {
            for (j = 0; j < width; j++) {
                printf("%d", v[i][j]);
    
            }
            printf("
    ");
        }
    }
    
    int main() {
    
        int v[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        int *p[3] = { v[0], v[2], v[1]}; // v[0], v[1],v[2]
        print(p, 3, 3);
        return 0;
    }
    
    
    123
    789
    456
    
    Process returned 0 (0x0)   execution time : 12.514 s
    Press any key to continue.

    30.3- 在函式间间传递任意长宽的二维阵列

    在函式间传递一维阵列

    直接传递阵列的指标 

    void print (int  (*v) [3]);    这种方法阵列是一个整体,改不了大小

    隐性转型后传递阵列第一个元素的指标与阵列长度

    void print (int *v,  int N);   这种可以改变大小

     

    在函式间传递二维阵列

    直接传递指标阵列

    void print(int (*v) [3] [3]); 

    隐性转型后传递阵列第一个元素的指标与阵列长度

    void print(int  (*v) [3],  int height);

     

    void print  ( *v  ,  int height,  int width);

     

    P提供了阵列开头的位置

    31.1  储存多个字串

    区别

    char strA[3][4] = {"How", "are", "you"};// 以最多个字串来决定第二个[]
    
    const char *strB[3] = {"How", "are","you"};
    
    strA[2][0] = 'Y';  //(O)
    
    strA[0] = "What";  // (X)
    
    strcpy(strA[0], "what"); // (X)
    
    
    
    strB[2][0] = 'Y';     // (X)
    strB[0] = "What";    // (O)
    strcpy(strA[B], "what"); // (X)

    31.3- 输入不定个数的字串

    题目:

    #include <stdio.h>
    #include <string.h>
    int main() {
        char raw[5000];
        char *str[100];
        char input[50]; // 输入有多长
        int size = 0;  //目前用的几个字元
        int len = 0;
        while (1) {
            scanf("%s", input);
            if (strcmp(input, "END") == 0) break;
            str[len] = &raw[size];  // 存位址
            strcpy(str[len], input);  // 输入的内容存进去
            size += strlen(input) + 1; // 1 代表那个斜线0
            ++len;
        }
        printf("--------
    ");
        int i;
        for (i = 0; i < len; i++) {
            printf("%s ", str[i]);
        }
        printf("
    (%d, %d)
    ", len, size);
        return 0;
    }
    How
    are
    you
    my
    sex
    lady
    i
    love
    you
    END
    --------
    How are you my sex lady i love you
    (9, 35)

     

  • 相关阅读:
    Android学习之多线程开发总结<二>
    Android学习之多线程开发总结<一>
    Android代码模版整理<一>
    Android学习之Bluetooth开发总结<续3>
    Android学习—自定义组件
    Android学习之解析XML
    Android学习—自定义对话框Dialog
    Android学习之Bluetooth开发总结<续2>
    Android学习之Bluetooth开发总结<续>
    .Net Core 发布项目时出现警告提示“不建议指定此包的版本”的解决办法
  • 原文地址:https://www.cnblogs.com/pxxfxxxx/p/10890748.html
Copyright © 2011-2022 走看看