数组和指针 笔试题(1)

9df55bd9ae9a480e88d51cef59abb437.png

目录

0.复习

1.笔试题1

2.笔试题2

3.笔试题3

4.笔试题4

5.笔试题5


 

0.复习

在做笔试题之前,我们首先复习一下数组名的理解

数组名的所有情况:

1.&数组名,取出的是整个数组的地址

2.sizeof(数组名),这里的数组名表示整个数组,这里的数组名必须单独出现

3.其余所有情况都为首元素地址

其次我们复习一下 sizeof 和 strlen 的知识

sizeof测量字节大小

strlen测量字符串长度,直到 '\0' 停止


1.笔试题1

//笔试题1
int a[] = { 1,2,3,4 };
printf("%zd\n", sizeof(a));
//a表示整个数组,sizeof测量整个数组,打印16
printf("%zd\n", sizeof(a + 0));
//a是数组首元素地址,地址加0,还是首元素地址,是地址就打印4/8
printf("%zd\n", sizeof(*a));
//首元素地址解引用=1,打印4
printf("%zd\n", sizeof(a+1));
//首元素地址加1,跳过1个sizeof(int),但是是地址,是地址就打印4/8
printf("%zd\n", sizeof(a[1]));
//首元素,打印4
printf("%zd\n", sizeof(&a));
//取出整个元素地址,整个元素地址为首元素地址,是地址就打印4/8
printf("%zd\n", sizeof(*&a));
//取出整个元素地址,解引用为整个数组,16
printf("%zd\n", sizeof(&a+1));
//是地址,打印4/8
printf("%zd\n", sizeof(&a[0]));
//取出首元素地址,是地址就打印4/8
printf("%zd\n", sizeof(&a[0] + 1));
//取出首元素+1个sizeof(int)的地址,是地址就打印4/8

sizeof(地址),是地址就打印 4/8


2.笔试题2

//笔试题2
char arr[] = { 'a','b','c','d','e','f' };
printf("%zd\n", sizeof(arr)); 
//传递的是整个数组,打印6
printf("%zd\n", sizeof(arr+0));
//传递首元素地址,加0还是地址,是地址就打印4/8
printf("%zd\n", sizeof(*arr));
//传递的是首元素,首元素地址解引用 = 'a',打印1
printf("%zd\n", sizeof(arr[1]));
//首元素,打印1
printf("%zd\n", sizeof(&arr));
//传递的是整个数组的地址,是地址就打印4/8
printf("%zd\n", sizeof(&arr+1));
//传递的是地址,是地址就打印4/8
printf("%zd\n", sizeof(&arr[0]+1));
//传递的是首元素的地址加1,指向的是第二个元素的地址,是地址就打印4/8

3.笔试题3

知识:strlen接受的参数是字符型地址

字符串都是从哪个地址开始数

//笔试题3
char arr[] = { 'a','b','c','d','e','f' };
printf("%zd\n", strlen(arr)); 
//传递的是首元素的地址,从a开始数,没有'\0'打印随机值
printf("%zd\n", strlen(arr+0));
//传递的是首元素地址,从a开始数,没有'\0'打印随机值
printf("%zd\n", strlen(*arr));
//传递的是字符a,错误传递,strlen接受的参数是地址,报错
printf("%zd\n", strlen(arr[1]));
//传递的是字符a,strlen接受的参数是地址,报错
printf("%zd\n", strlen(&arr));
//传递的是整个元素的地址,也就是从a开始数,没有'\0'打印随机值
printf("%zd\n", strlen(&arr+1));
//传递的是整个元素的地址加1,跳过了整个数组的地址,没有'\0'打印随机值
printf("%zd\n", strlen(&arr[0]+1));
//传递的是首元素地址加1,所以传递的是b的地址,从b开始数,没有'\0'打印随机值

4.笔试题4

//笔试题4
char arr[] = { "abcdef" };
printf("%zd\n", strlen(arr)); 
//传递的是首元素的地址,从首元素地址开始数,打印6
printf("%zd\n", strlen(arr+0));
//从首元素地址开始数打印6
printf("%zd\n", strlen(*arr));
//传递的不是地址,报错
printf("%zd\n", strlen(arr[1]));
//传递的不是地址,报错
printf("%zd\n", strlen(&arr));
//从首元素开始数,打印6
printf("%zd\n", strlen(&arr+1));
//跳过一整个数组,打印随机数
printf("%zd\n", strlen(&arr[0]+1));
//从第二个元素的地址开始数,打印5

5.笔试题5

	//笔试题5
	char arr[] = { "abcdef" };
	printf("%zd\n", sizeof(arr)); 
	//传递的是整个数组,但是字符串带 '\0' ,打印7!!!
	printf("%zd\n", sizeof(arr+0));
	//传递的是首元素地址,是地址就打印4/8
	printf("%zd\n", sizeof(*arr));
	//传递的是首元素,打印1
	printf("%zd\n", sizeof(arr[1]));
	//打印1
	printf("%zd\n", sizeof(&arr));
	//传递的是整个元素的地址,是地址就打印4/8
	printf("%zd\n", sizeof(&arr+1));
	//传递的是跳过整个元素的地址,是地址就打印4/8
	printf("%zd\n", sizeof(&arr[0]+1));
	//传递的是首元素地址加1,就是第二个元素的地址,是地址就打印4/8

048348842c894b78a320466e0b48b67d.png

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值