数组和指针常见笔试and期末题(超详细)

1.一维数组

int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
//此时计算的是整个数组的大小,为4*4,即16
printf("%d\n",sizeof(a+0));
//a+0此时代表了a数组首元素的地址,地址一般为4字节或者8字节
printf("%d\n",sizeof(*a));
//*a代表了数组首元素1,故结果为4
printf("%d\n",sizeof(a+1));
//a+1代表数组中第二个元素的地址,既然是地址,为4或8
printf("%d\n",sizeof(a[1]));
//数组第二个元素2,结果为4
printf("%d\n",sizeof(&a));
//4或8
printf("%d\n",sizeof(*&a));
//*与&相互抵消,相当于a,计算的是整个数组的大小,16
printf("%d\n",sizeof(&a+1));
//&的优先级大于+,故输出为跳过数组的第一位地址,4或8
printf("%d\n",sizeof(&a[0]));
//首元素地址,4或8
printf("%d\n",sizeof(&a[0]+1));
//地址。4或8

2.字符数组

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
//得到数组大小,6
printf("%d\n", sizeof(arr+0));
//地址4或8
printf("%d\n", sizeof(*arr));
//首元素,1
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[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
//随机,没有遇到\0
printf("%d\n", strlen(arr+0));
//随机,没有遇到\0
printf("%d\n", strlen(*arr));
//错误,strlen是通过地址来寻找的
printf("%d\n", strlen(arr[1]));
//错误,strlen是通过地址来寻找的
printf("%d\n", strlen(&arr));
//随机,没有遇到\0
printf("%d\n", strlen(&arr+1));
//随机,没有遇到\0
printf("%d\n", strlen(&arr[0]+1));
//随机,没有遇到\0
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
//7个元素,包含\0,得到7
printf("%d\n", sizeof(arr+0));
//地址,4或8
printf("%d\n", sizeof(*arr));
//首元素a,1
printf("%d\n", sizeof(arr[1]));
//第二个元素b,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
int main()
{
char* p = "abcdef";
printf("%zd\n", strlen(p));
//6
printf("%zd\n", strlen(p + 1));
//5
//printf("%zd\n", strlen(*p));
//err,报错,需要地址,而非元素
//printf("%zd\n", strlen(p[0]));
//p[0]--*(p+0)-->*p //err,类型冲突
printf("%zd\n", strlen(&p));
//随机值
printf("%zd\n", strlen(&p + 1));
//随机值
printf("%zd\n", strlen(&p[0] + 1));//5
return 0;
}

3.二维数组

int a[3][4]= { 0 };
printf("%zd\n", sizeof(a));
//12*4 = 48个字节, 数组名单独放在sizeof内部
printf("%zd\n", sizeof(a[0][0]));
//4
printf("%zd\n", sizeof(a[0]));
//a[0]是第一行这个一维数组的数组名, 数组名单独放在sizeof内部了
//计算的是第一行的大小,单位是字节, 16个字节
printf("%zd\n", sizeof(a[0] + 1));
//a[0]第一行这个一维数组的数组名,这里表示数组首元素
//也就是a[0][0]的地址, a[0] + 1是a[0][1]的地址
printf("%zd\n", sizeof(*(a[0] + 1)));
//a[0][1] - 4个字节
printf("%zd\n", sizeof(a + 1));
//a是二维数组的数组名, 但是没有&, 也没有单独放在sizeof内部
//所以这里的a是数组收元素的地址, 应该是第一行的地址,a+1是第二行的地址
//大小也是4/8 个字节
printf("%zd\n", sizeof(*(a+ 1)));
//*(a + 1) ==> a[1] - 第二行的数组名, 单独放在sizeof内部,计算的是第二行的大小
//16个字节
printf("%zd\n", sizeof(&a[0] + 1));
//&a[0]是第一行的地址,&a[0]+1就是第二行的地址,4/8
printf("%zd\n", sizeof(*(&a[0] + 1)));
//访问的是第二行, 计算的是第二行的大小, 16个字节
//int(*p)[4] = &a[0] + 1;
printf("%zd\n", sizeof(*a));
//这里的a是第一行的地址, *a就是第一行,512eof(xa)计算的是第一行的大小-16
//*a --> *(a+0) --> a[0]|
printf("%zd\n", sizeof(a[3]));
//这里不存在越界
//因为sizeof内部的表达式不会真实计算的
//计算的是第四行的大小-16

  希望大家好好研究,不管期末还是笔试还是林林总总的比赛啥的,都是易考点哦。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三千弱水,取一瓢饮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值