简单不先于复杂,而是在复杂之后。
注:题目会附在前面,大家可以先复制代码自己做一遍,再看答案。
目录
1. 一维数组
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //一维数组 int main() { int a[] = { 1,2,3,4 }; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(a + 0)); printf("%d\n", sizeof(*a)); printf("%d\n", sizeof(a + 1)); printf("%d\n", sizeof(a[1])); printf("%d\n", sizeof(&a)); printf("%d\n", sizeof(*&a)); printf("%d\n", sizeof(&a + 1)); printf("%d\n", sizeof(&a[0])); printf("%d\n", sizeof(&a[0] + 1)); return 0; }
完整代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //一维数组 int main() { int a[] = { 1,2,3,4 }; printf("%d\n", sizeof(a));//16 //sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节 printf("%d\n", sizeof(a + 0));//4(32位平台)/8(64位平台) //数组名并不是单独放在 sizeof 内部,也没有取地址,故数组名代表首元素地址,a+0后还是首元素地址 //是地址,大小就是4/8个字节 printf("%d\n", sizeof(*a));//4 //*a 中的 a 就是数组首元素的地址,*a 就是对首元素的地址解引用找到的就是首元素 //首元素的大小就是4个字节 printf("%d\n", sizeof(a + 1));//4或者8 //a 是首元素地址,a + 1 代表第二个元素的地址 //大小是4/8 printf("%d\n", sizeof(a[1]));//4 //计算的是数组第二个元素的大小 printf("%d\n", sizeof(&a));//4/8 //&a 取出的是数组的地址,数组的地址,也就是个地址 //是地址,大小就是4/8 printf("%d\n", sizeof(*&a));//16 //&a 得到的是数组的地址,类型是int(*)[4],是一种数组指针 //数组指针解引用找到的是数组 //也可以理解为 & 和 * 抵消 printf("%d\n", sizeof(&a + 1));//4/8 //&a 取出的是数组的地址,= //&a 类型是 int(*)[4] //&a+1 是从数组a的地址向后跳过一个了(4个整型元素的)数组的大小 //&a+1还是地址,是地址就是4/8个字节 printf("%d\n", sizeof(&a[0]));//4/8 //&a[0]取出的是第一个元素的地址 //计算的就是地址的大小 printf("%d\n", sizeof(&a[0] + 1));//4/8 //&a[0]+1 是第二个元素的地址 //大小是4/8个字节 return 0; }
2. 字符数组
strlen: 求字符串长度的,关注的是字符串中的 \0 ,计算的是 \0 之前出现的字符字数
是库函数,只针对字符串
sizeof:只关注占用内存空间的大小,不在乎内存中放的是什么
是操作符
2.1 sizeof 相关
2.1.1 题一
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { //字符数组 char arr[] = { 'a','b','c','d','e','f' }; printf("%d\n", sizeof(arr)); printf("%d\n", sizeof(arr + 0)); printf("%d\n", sizeof(*arr)); printf("%d\n", sizeof(arr[1])); printf("%d\n", sizeof(&arr)); printf("%d\n", sizeof(&arr + 1)); printf("%d\n", sizeof(&arr[0] + 1)); return 0; }
完整代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { //字符数组 char arr[] = { 'a','b','c','d','e','f' }; printf("%d\n", sizeof(arr));//6 //sizeof(数组名)计算整个数组的大小 printf("%d\n", sizeof(arr + 0));//4/8 //arr + 0 是数组首元素的地址 printf("%d\n", sizeof(*arr));//1 //*arr 就是数组的首元素,大小是1字节 //*arr --> arr[0 //*(arr + 0) --> arr[0] printf("%d\n", sizeof(arr[1]));//1 printf("%d\n", sizeof(&arr));//4/8 //&arr 是数组的地址,是地址就是4/8个字节 printf("%d\n", sizeof(&arr + 1));//4/8 //&arr + 1 是数组后的地址 printf("%d\n", sizeof(&arr[0] + 1));//4/8 //&arr[0] + 1 是第二个元素的地址 return 0; }
2.1.2 题二
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { char arr[] = "abcdef"; printf("%d\n", sizeof(arr)); printf("%d\n", sizeof(arr + 0)); printf("%d\n", sizeof(*arr)); printf("%d\n", sizeof(arr[1])); printf("%d\n", sizeof(&arr)); printf("%d\n", sizeof(&arr + 1)); printf("%d\n", sizeof(&arr[0] + 1)); return 0; }
2.1.3 题三
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { char* p = "abcdef"; printf("%d\n", sizeof(p)); printf("%d\n", sizeof(p + 1)); printf("%d\n", sizeof(*p)); printf("%d\n", sizeof(p[0])); printf("%d\n", sizeof(&p)); printf("%d\n", sizeof(&p + 1)); printf("%d\n", sizeof(&p[0] + 1)); return 0; }
2.2 strlen 相关
2.2.1 题一
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> int main() { char arr[] = { 'a','b','c','d','e','f' }; printf("%d\n", strlen(arr)); printf("%d\n", strlen(arr + 0)); printf("%d\n", strlen(*arr)); printf("%d\n", strlen(arr[1])); printf("%d\n", strlen(&arr)); printf("%d\n", strlen(&arr + 1)); printf("%d\n", strlen(&arr[0] + 1)); return 0; }
完整代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> int main() { char arr[] = { 'a','b','c','d','e','f' }; printf("%d\n", strlen(arr));//随机值 // strlen 会从数组首地址直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0') printf("%d\n", strlen(arr + 0));//随机值(同理) printf("%d\n", strlen(*arr));//--> strlen('a'); --> strlen(97); //野指针 //程序会报错 printf("%d\n", strlen(arr[1]));//--> strlen('b'); --> strlen(98); //野指针 printf("%d\n", strlen(&arr));//随机值 printf("%d\n", strlen(&arr + 1));//随机值 - 6 printf("%d\n", strlen(&arr[0] + 1));//随机值 - 1 return 0; }
2.2.2 题二
2.2.3 题三
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> int main() { char* p = "abcdef"; printf("%d\n", strlen(p)); printf("%d\n", strlen(p + 1)); printf("%d\n", strlen(*p)); printf("%d\n", strlen(p[0])); printf("%d\n", strlen(&p)); printf("%d\n", strlen(&p + 1)); printf("%d\n", strlen(&p[0] + 1)); return 0; }
3. 二维数组
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int a[3][4] = { 0 }; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(a[0][0])); printf("%d\n", sizeof(a[0])); printf("%d\n", sizeof(a[0] + 1)); printf("%d\n", sizeof(*(a[0] + 1))); printf("%d\n", sizeof(a + 1)); printf("%d\n", sizeof(*(a + 1))); printf("%d\n", sizeof(&a[0] + 1)); printf("%d\n", sizeof(*(&a[0] + 1))); printf("%d\n", sizeof(*a)); printf("%d\n", sizeof(a[3])); return 0; }