指针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)

 

原文地址:https://www.cnblogs.com/pxxfxxxx/p/10890748.html