进阶指针 (二)

前言:本章讲的是指针面试题,但是在这里我想提一下:strlen 和 sizeof 的区别。
strlen : 是求字符串的长度,关注的是 ‘\0’, 计算的是’\0’ 之前出现的字符串个数。是一个库函数,只针对字符串。
sizeof :只关注占用内存空间的大小,不在乎内存中存放的是什么,sizeof 是操作符。

一 、 数组名指针面试题

一维数组

#define _CRT_SECURE_NO_WARNINGS    
#include<stdio.h>
int main()
{
		//数组名是首元素地址,但有两个除外
		//sizeof(数组名)--数组名表示整个数组的大小
		//&数组名 -- 数组名表示整个数组
		  
		// 一维数组,有些答案是4/8,因为平台不一样,32位系统的是4,64位系统的是8
		int arr[] = { 1, 2, 3, 4 };
		printf("%d\n", sizeof(arr));//16, sizeof(数组名) - 计算的是数组的总大小,单位字节是16
		printf("%d\n", sizeof(arr + 0));//4/8 , 数组名这里表示首元素的地址,arr + 0还是首元素的地址
		//地址的大小就是4/8个字节
		printf("%d\n", sizeof(*arr));//4,数组名是首元素的地址,*arr就是首元素的值
		printf("%d\n", sizeof(arr + 1));//4/8,数组名这里表示首元素的地址,arr+1就表示第二个元素的地址
		printf("%d\n", sizeof(arr[1]));//4,arr[1]表示的是第二个元素的值
		printf("%d\n", sizeof(&arr));//4/8,&arr表示的是整个数组的地址,但是整个数组的地址还是地址,地址的大小就是4/8
		printf("%d\n", sizeof(*&arr));//16,&arr表示的是整个数组的地址,*&arr解引用访问数组,sizeof计算的是数组的大小
		printf("%d\n", sizeof(&arr + 1));//4/8,&arr是整个数组的地址,&arr + 1 就是跳过整个数组,但还是地址
		printf("%d\n", sizeof(&arr[0]));//4/8,&arr[0]是首元素的地址
		printf("%d\n", sizeof(&arr[0] + 1));//4/8,&arr[0] + 1 是第二个元素的地址
	

	//字符数组
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));//sizeof计算的是数组的大小,6*1= 6(字节)
	printf("%d\n", sizeof(arr + 0));//4/8,arr是数组首元素的地址,arr+0还是数组首元素的地址,地址的大小就是4/8字节
	printf("%d\n", sizeof(*arr));//1,arr是首元素的地址,*arr就是首元素,首元素是字符大小是一个字节
	printf("%d\n", sizeof(arr[1]));//1,arr[1]数组第二个元素
	printf("%d\n", sizeof(&arr));//4/8,&arr是数组的地址,是地址就是4/8字节
	printf("%d\n", sizeof(&arr + 1));//4/8,&arr + 1跳过整个数组后的地址,是地址就是4/8字节
	printf("%d\n", sizeof(&arr[0] + 1));//4/8,数组第二个元素的地址

	//strlen是库函数 求的是字符串的大小,它是通过指针(指针变量,存储地址)去访问字符串的,遇到了\0的地址就会停下来
	//所以要给一个地址strlen函数
	printf("%d\n", strlen(arr));//随机值,arr是首元素的地址
	printf("%d\n", strlen(arr + 0));//随机值,arr + 0也是首元素的地址
	printf("%d\n", strlen(*arr));//err,*arr 是数组首元素
	printf("%d\n", strlen(arr[1]));//err,arr[1] 是数组首元素
	printf("%d\n", strlen(&arr));//随机值,&arr是数组的地址
	printf("%d\n", strlen(&arr + 1));//随机值 - 6,&arr + 1是跳个数组后的地址
	printf("%d\n", strlen(&arr[0] + 1));//随机值 - 1,&arr[0] + 1,时候数组第二个元素的地址
	return 0;
}


二维数组

知识点:我们要把二维数组arr[n][m],看成 n 个一维数组,也就是把二维数组中的每一行,当成一个一维数组。

#define _CRT_SECURE_NO_WARNINGS  
#include<stdio.h>
int main()
{
	int arr[4][3] = { 0 };
	
	printf("%d\n", sizeof(arr[0]));//12,arr[0]相当于数组名,数组名放在sizeof内部,求的是数组的大小,单位是字节
	printf("%d\n", sizeof(arr[4]));//12,虽然数组没有第四行,但是sizeof不会去找到arr[4]这一行,它只是一个操作符,根据arr数组名去求
	printf("%d\n", sizeof(arr));//48,数组名,求得是数组的大小
	printf("%d\n",sizeof(&arr[0]));//4,&arr[0],取出的是数组第一行的地址
	printf("%d\n", sizeof(&arr[0] + 1));//4,&arr[0] + 1 求的是数组第二行的地址
	printf("%d\n", sizeof(arr[0] + 1));//4,求的是第一行第二个数组的地址
	return 0;
}

在这里插入图片描述

二 、 指针面试题(2)

在这里插入图片描述

三 、 指针面试题(3)

在这里插入图片描述

四 、 指针面试题(4)

在这里插入图片描述

五 、 指针面试题(5)

在这里插入图片描述

六 、 指针面试题(6)

在这里插入图片描述

七 、 指针面试题(7)

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小刘家的程序猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值