指针和数组面试题解析

数组名是首元素的地址,但是有两个例外
1.sizeof(首组名) - 数组名表示整个数组
2.&数组名 - 数组名表示整个数组
除了这两个之外,其他都是表示首元素的地址

一维数组

整型数组

```c
int main()
{
   
	int a[] = {
    1, 2, 3, 4 };
	printf("%d\n",sizeof(a));//16 
	//sizeof(数组名) -计算的是数组总大小,单位是字节 4*4 = 16
	printf("%d\n",sizeof(a+0));//4  
	//这里是a+0,但不是数组名,是首元素地址,是地址大小就是4/8个字节
	printf("%d\n",sizeof(*a)); //4
	// 数组名表示首元素地址 *a就是首元素,sizeof(*a)就是4
	printf("%d\n",sizeof(a+1)); //4
	//a还是首元素地址+1跳过一个元素,就是第二个元素的地址,所以还是4/8  在32是4 在64就是8
	printf("%d\n",sizeof(a[1])); //4 
	//计算第二个元素的大小
	printf("%d\n",sizeof(&a));//4
	//&a  取出的是数组的地址,但是数组的地址也是地址,地址的大小就是4个或者8个字节 
	printf("%d\n",sizeof(*&a));//16
	// &a 是数组的地址,数组的地址解引用访问的是数组,sizeof计算的是数组的大小,单位是字节
	printf("%d\n",sizeof(&a+1));//4/8
	//&a是数组的地址,&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;
}

字符数组

char arr[] = { ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’ };

int main()
{
   
	char arr[] = {
    'a', 'b', 'c', 'd', 'e', 'f' };
	printf("%d\n", sizeof(arr));//6
	//sizeof计算的是数组大小 6个元素 每个元素是char 单位是字节
	printf("%d\n", sizeof(arr + 0));//4
	//这里arr也是首元素地址,所以还是4
	printf("%d\n", sizeof(*arr));//1
	//arr是首元素地址,解引用就是首元素 ,首元素大小1个字节
	printf("%d\n", sizeof(arr[1]));//1
	//这里算的是第二个字符的大小也是1
	printf("%d\n", sizeof(&arr));//4
	//这里取整个数组的地址,但还是地址,所以大小是4/8
	printf("%d\n", sizeof(&arr + 1));//4
	//这里整个数组的地址&arr+1,就是跳过整个数组,但还是地址地址大小是4/8个字节
	printf("%d\n", sizeof(&arr[0] + 1));//4
	//取出第一个元素的地址+1 那么就是第二个元素的地址

	//strlen是求字符串的长度,也就是在找\0 strlen要的是地址,不要传其他的
	//arr没有被sizeof(arr) &arr 之外就是首元素的地址
	printf("%d\n", strlen(arr));//随机值
	//这里的arr表示的是首元素的地址 strlen找不到\0所以就是随机值
	printf("%d\n", strlen(arr + 0));//随机值
	//这里的arr表示的是首元素的地址 strlen找不到\0所以就是随机值
	printf("%d\n", strlen(*arr));//非法访问 err
	//这里是字符'a' 字符a的Ascall值是97相当于把97传进去
	printf("%d\n", strlen(arr[1]));//非法访问 err
	//这里是字符'b' 字符b的Ascall值是98相当于把98传进去
	printf("%d\n", 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值