指针和数组笔试题

作者 :ふり

专栏 :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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值