1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
// 数组 #include <stdio.h> #define MONTHS 12; int main(void) { int a[6]; int b[6] = {1, 2, 3, 4, 5, 6}; int c[] = {1, 2, 3, 4, 5, 6}; int d[6] = {1, 2, 3}; // 只读数组,必须在声明时赋值 const int e[2] = {1, 2}; // 输出 24 and 24 and 6 printf("%d and %d and %d\n", sizeof(a), sizeof(b), sizeof(b) / sizeof(b[0])); // 计算数组的长度 int size = sizeof(b) / sizeof(b[0]); for (int i = 0; i < size; ++i) { // a会取内存中的脏值,b、c正常,d的后3位会默认为0 printf("a=%-15d and b=%-15d and c=%-15d and d=%-15d\n", a[i], b[i], c[i], d[i]); } // 可以使用[index]来为指定的元素赋值 int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29}; getchar(); return 0; } // 错误的数组赋值 #include <stdio.h> int main(int argc, char const *argv[]) { int arr1[4]; int arr2[4] = {1, 2, 3, 4}; //以下三种赋值方式都是错误的 arr1 = arr2; arr1[4] = arr2[4]; //花括号赋值只能用于初始化的时候 arr1[4] = {1, 2, 3, 4}; return 0; } // 数组与指针 #include <stdio.h> int main(int argc, char const *argv[]) { int arr[4] = {1, 2, 3, 4}; int rs; rs = arr == &arr[0]; printf("%p and %p\n", arr, &arr[0]); // 输出1(true) 数组名是该数组首元素的地址 printf("%d\n", rs); // 同理 arr+2 == &arr[2] *(arr+2) == arr[2] getchar(); return 0; } // 未初始化的指针赋值 #include <stdio.h> int main(void) { // 以下做法是不对的,把5放到pt所指向的地址,但是地址还没有被初始化 int *pt; //未初始化的指针 *pt = 5; // 可以这么做 int a; int *pt; pt = &a; *pt = 5; printf("%d %d\n", *pt, a); getchar(); return 0; } // 比如数组求和,不需要修改数组原值,使用const可防止数组被误修改 #include <stdio.h> int sum(const int[], int); int main(int argc, char const *argv[]) { int arr[6] = {1, 2, 3, 4, 5, 6}; int length = sizeof(arr) / sizeof(arr[0]); int arrSum = sum(arr, length); printf("%d\n", arrSum); getchar(); return 0; } int sum(const int arr[], int length) { int i; // 变量名不要和函数名一样并初始化一个值 否则编译后的结果可能并不是你想要的 int arrSum = 0; for (i = 0; i < length; ++i) { arrSum += arr[i]; } return arrSum; } |