c语言_Day30_07_31
1、指针和数组笔试题
1、大小问题
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a)); // 16
printf("%d\n", sizeof(a + 0)); // 4
printf("%d\n", sizeof(a)); // 4
printf("%d\n", sizeof(a + 1)); // 4
printf("%d\n", sizeof(a[1])); // 4
printf("%d\n", sizeof(&a)); // 4
printf("%d\n", sizeof(&a)); // 16
printf("%d\n", sizeof(&a + 1)); // 4
printf("%d\n", sizeof(&a[0])); // 4
printf("%d\n", sizeof(&a[0] + 1)); // 4
return 0;
} sizeof(数组名) --- 数组总大小
sizeof(地址) --- 4或8字节
注:数组名为数组首元素的地址,但存在两个例外:
- sizeof返回整个数组大小
- &数组名 种数组名表示整个数组
int main()
{
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr)); // 6
printf("%d\n", sizeof(arr + 0)); // 4
printf("%d\n", sizeof(*arr)); // 1
printf("%d\n", sizeof(arr[1])); // 1
printf("%d\n", sizeof(&arr)); // 4
printf("%d\n", sizeof(&arr + 1)); // 4
printf("%d\n", sizeof(&arr[0] + 1)); // 4
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)); // 随机
char str[] = "abcdef";
printf("%d\n", sizeof(str)); // 7
printf("%d\n", sizeof(str + 0)); // 4
printf("%d\n", sizeof(str)); // 1
printf("%d\n", sizeof(str[1])); // 1
printf("%d\n", sizeof(&str)); // 4
printf("%d\n", sizeof(&str + 1)); // 4
printf("%d\n", sizeof(&str[0] + 1)); // 4
printf("%d\n", strlen(str)); // 6
printf("%d\n", strlen(str + 0)); // 6
printf("%d\n", strlen(str[1])); // 程序崩溃
printf("%d\n", strlen(*str)); // 程序崩溃
printf("%d\n", strlen(&str)); // 6
printf("%d\n", strlen(&str + 1)); // 随机
printf("%d\n", strlen(&str[0] + 1)); // 5
return 0;
} strlen函数读到'\0'返回前面的字符个数,传入非法地址会导致程序崩溃
char p = "abcdef";
printf("%d\n", sizeof(p)); // 4
printf("%d\n", sizeof(p + 1)); // 4
printf("%d\n", sizeof(p)); // 1
printf("%d\n", sizeof(p[0])); // 1
printf("%d\n", sizeof(&p + 1)); // 4
printf("%d\n", sizeof(&p[0] + 1)); // 4
printf("%d\n", strlen(p)); // 6
printf("%d\n", strlen(p + 1)); // 5
printf("%d\n", strlen(*p)); // err
printf("%d\n", strlen(p[0])); // err
printf("%d\n", strlen(&p + 1)); // 随机
printf("%d\n", strlen(&p[0] + 1)); // 5
int arr[3][4] = { 0 };
printf("%d\n", sizeof(arr)); // 48
printf("%d\n", sizeof(arr[0][0])); // 4
printf("%d\n", sizeof(arr[0])); // 16
printf("%d\n", sizeof(arr[0] + 1)); // 4
printf("%d\n", sizeof((arr[0] + 1))); // 4
printf("%d\n", sizeof(arr + 1)); // 4
printf("%d\n", sizeof((arr + 1))); // 16
printf("%d\n", sizeof(&arr[0] + 1)); // 4
printf("%d\n", sizeof(*(&arr[0]+1))); // 16
printf("%d\n", sizeof(*arr)); // 16
printf("%d\n", sizeof(arr[3])); // 16 sizeof(arr)把数组名单独放入sizeof内,计算第i行的数组大小
注:sizeof内部表达式不实际计算,仅根据类型计算大小,故其表达式内部的数组越界访问不会报错
|