作者 :ふり
专栏 :C语言进阶
格言 : 知行并进
😻 指针和数组笔试题解析
💥 一维数组
#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;
}
答案:
//一维数组
#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
//a不是单独放在sizeof 内部,也没有取地址,所以a就是首元素地址 a + 0 表示首元素地址
//是地址,大小就是4/8字节
printf("%d\n", sizeof(*a));// 4
//a <=> &a[0]
//*a = * &a[0]
//* &a[0] = a[0]
printf("%d\n", sizeof(a + 1));//4/8
//a不是单独放在sizeof 内部,也没有取地址,所以a就是首元素地址 ,a + 1 表示第二个元素地址
//是地址,大小就是4/8字节
printf("%d\n", sizeof(a[1]));//4
//计算的是第二个元素的大小
printf("%d\n", sizeof(&a));//4/8
//&a取出的是数组的地址,数组的地址,也就是地址
printf("%d\n", sizeof(*&a));//16
//* &a 是对数组的地址解引用 ,得到的是整个数组
printf("%d\n", sizeof(&a + 1));//4/8
//&a + 1
//&a 拿到的是数组的地址,数组地址加1跳过的是一个数组,还是地址
printf("%d\n", sizeof(&a[0]));//4/8
//&a[0]是首元素的地址
printf("%d\n", sizeof(&a[0] + 1));
//&a[0]+1 是第二个元素的地址
return 0;
}
💥 字符数组
👉 不存在 ’ \0 ’
#include <stdio.h>
#include <string.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));
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;
}
答案 :
#include <stdio.h>
#include <string.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表示首元素地址,*arr 就是首元素
printf("%d\n", sizeof(arr[1]));
//arr[1] 表示首元素
printf("%d\n", sizeof(&arr));//4/8
//&arr 表示的是数组的地址
printf("%d\n", sizeof(&arr + 1));//4/8
//&arr+1 数组的地址+1 ,跳过整个数组,数组后的地址
printf("%d\n", sizeof(&arr[0] + 1));//4/8
//第一个元素的地址+1
char arr[] = { 'a','b','c','d','e','f' };
//strlen 求字符串长度 ,关注 ' \0 '
printf("%d\n", strlen(arr));//随机值
//里面不存在 '\0'
//首元素地址
printf("%d\n", strlen(arr + 0));//随机值
//首元素地址 + 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));//随机值
//&arr 是这个数组的地址
//里面不存在 '\0'
printf("%d\n", strlen(&arr + 1));//随机值-6
//数组的地址 + 1
printf("%d\n", strlen(&arr[0] + 1));//随机值-1
//首元素地址+1
return 0;
}
👉 存在 ’ \0 ’
#include <stdio.h>
#include <string.h>
int main()
{
//字符数组
char arr[] = "abcdef";// abcdef\0
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));
char arr[] = "abcdef";
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;
}
答案 :
#include <stdio.h>
#include <string.h>
int main()
{
//字符数组
char arr[] = "abcdef";
// a b c d e f \0
printf("%d\n", sizeof(arr));//7
printf("%d\n", sizeof(arr + 0));//4/8
//首元素地址 + 0
printf("%d\n", sizeof(*arr));//1
//arr 表示首元素地址 *arr 就是首元素
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8
printf("%d\n", sizeof(&arr + 1));//4/8
printf("%d\n", sizeof(&arr[0] + 1));//4/8
char arr[] = "abcdef";
//strlen 是求字符串长度,关注的是字符串中的 \0 ,计算的是 \0 之前出现的字符的个数
//strlen是库函数,只针对字符串
//sizeof只关注占用内存空间的大小,不在乎内存中放的是什么
//sizeof是操作符
//
printf("%d\n", strlen(arr));//6
printf("%d\n", strlen(arr + 0));//6
printf("%d\n", strlen(*arr));//野指针
printf("%d\n", strlen(arr[1]));//野指针
printf("%d\n", strlen(&arr));//6
printf("%d\n", strlen(&arr + 1));//随机值
//后面并没有 \0 了
printf("%d\n", strlen(&arr[0] + 1));//5
return 0;
}
🔥 指针
#include <stdio.h>
#include <string.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));
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;
}
答案 :
#include <stdio.h>
#include <string.h>
int main()
{
//字符数组
char* p = "abcdef";
//p里面放的是首元素地址
printf("%d\n", sizeof(p));//4/8
printf("%d\n", sizeof(p + 1));//4/8
printf("%d\n", sizeof(*p));//1
//*p ---> 1
printf("%d\n", sizeof(p[0]));//1
//p[0] ---> *(p + 0)
printf("%d\n", sizeof(&p));//4/8
//&p 是地址
printf("%d\n", sizeof(&p + 1));//4/8
printf("%d\n", sizeof(&p[0] + 1));//4/8
char* p = "abcdef";
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));//随机值
printf("%d\n", strlen(&p + 1));//随机值
printf("%d\n", strlen(&p[0] + 1));//5
return 0;
}
💥 二维数组
#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;
}
答案 :
#include<stdio.h>
int main()
{
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//48
//3*4*4
printf("%d\n", sizeof(a[0][0]));//4
//二维数组第一个整形元素的大小
printf("%d\n", sizeof(a[0]));//16
//a[0],相当于第一行一维数组名,sizeof(a[0])
//是二维数组第一行的大小
printf("%d\n", sizeof(a[0] + 1));//4/8
//a[0], 相当于第一行一维数组名
//a[0]+1,相当于二维数组第一行第二个元素地址
printf("%d\n", sizeof(*(a[0] + 1)));//4
//*(a[0] + 1)-->a[0][1]
//计算的是第一行第二个元素的大小
printf("%d\n", sizeof(a + 1));//4/8
//a+1二维数组第二行元素的地址
printf("%d\n", sizeof(*(a + 1)));//16
//*(a + 1)-->a[1],相当于第二行一维数组名,sizeof(a[1])
//是二维数组第二行的大小
printf("%d\n", sizeof(&a[0] + 1));//4/8
//&a[0]-->&*(a+0)-->a
//&a[0] + 1-->a+1
printf("%d\n", sizeof(*(&a[0] + 1)));//16
//&a[0] + 1-->a+1
//*(&a[0] + 1)-->*(a+1)-->a[1]
//a[1], 相当于第二行一维数组名,sizeof(a[1])
//是二维数组第二行的大小
printf("%d\n", sizeof(*a));//16
//*a-->a[0]是二维数组第一行的地址
printf("%d\n", sizeof(a[3]));//16
//a[3]是二维数组第4行的地址
//虽然二维数组没有第四行,但该代码不是越界
//sizeof()内部表达式是不进行运算的,只是得到该表达式的数据类型
return 0;
}