指针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("\n"); 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("\n"); 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("\n"); 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("\n"); return 0; }
28.8 重新配置记忆体
使用realloc函式重新配置记忆体大小
- <stdlib.b>提供realloc函式复制记忆体内容
void* realloc(void* ptr, size_t size);
- 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("\n"); } } 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("--------\n"); int i; for (i = 0; i < len; i++) { printf("%s ", str[i]); } printf("\n(%d, %d)\n", 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)