C语言指针和数组笔试题

32位环境下

一、一维数组

int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a)); //16数组名a单独放在sizeof内部,
	//数组名表示整个数组,计算的是整个数组的大小
	
	printf("%d\n", sizeof(a + 0));//4  a表示首元素的地址,a + 0还是首元素的地址
	printf("%d\n", sizeof(*a));//4   a是首元素地址,*a就是地址
	printf("%d\n", sizeof(a + 1));//4  a表示首元素的地址,a + 1还是第二个元素的地址
	printf("%d\n", sizeof(a[1]));//4 a[1]就是第二个元素
	printf("%d\n", sizeof(&a));//4  &a拿到的是整个数组的地址,地址也是4个字节
	printf("%d\n", sizeof(*&a));//16 &a拿到的是整个数组, 就和sizeof(a)是一样的
	printf("%d\n", sizeof(&a + 1));//4 &a拿到的是整个数组的地址,a+1就是跳过整个数组的地址也是4个字节
	printf("%d\n", sizeof(&a[0]));//4  拿到的是首元素的地址
	printf("%d\n", sizeof(&a[0] + 1));//4 跳过一个元素的地址
	return 0;
}

二、字符数组

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };//6个字符
	printf("%d\n", sizeof(arr));//6  sizeof(arr) -- 计算的是整个数组的大小
	printf("%d\n", sizeof(arr + 0));//4  arr + 0 相当于首元素地址,所以计算的是地址的大小
	printf("%d\n", sizeof(*arr));//1 arr是数组名,是首元素的地址,*arr就是第一个元素
	printf("%d\n", sizeof(arr[1]));//1 计算的是第二个元素的大小
	printf("%d\n", sizeof(&arr));//4  &arr -- 拿到的是整个数组的地址,所以计算的是地址的大小
	printf("%d\n", sizeof(&arr + 1));//4 &arr+1计算的是跳过整个数组的地址,所以还是计算地址的大小
	printf("%d\n", sizeof(&arr[0] + 1));//4 拿到的是第二个元素的地址
	return 0;
}
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };//6个字符
	//strlen(arr) -- 计算的\0之前字符串的长度
	printf("%d\n", strlen(arr));//不确定,因为arr数组里面没有存放\0,所以不知道数组之后在哪里遇见\0 
	printf("%d\n", strlen(arr + 0));//不确定 
	//printf("%d\n", strlen(*arr));//*arr是第一个元素,strlen函数求的是\0之前的字符串,参数不匹配
	//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;
}

在这里插入图片描述

int main()
{
	char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//7 sizeof(arr) -- 计算的是整个字符串的大小
	printf("%d\n", sizeof(arr + 0));//4   sizeof(arr + 0) -- 拿到的首元素地址,所以是计算地址的大小
	printf("%d\n", sizeof(*arr));//1  *arr -- 相当于是'a'
	printf("%d\n", sizeof(arr[1]));//1 arr[1] -- 'b'
	printf("%d\n", sizeof(&arr));// 4 &arr 计算的是地址的大小
	printf("%d\n", sizeof(&arr + 1));//4  
	printf("%d\n", sizeof(&arr[0] + 1));//4 &arr[0]拿到的也是地址
	return 0;
}

int main()
{
	char arr[] = "abcdef";
	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));//随机值
	printf("%d\n", strlen(&arr[0] + 1)); //5
	return 0;
}

在这里插入图片描述

int main()
{
	char* p = "abcdef";
	printf("%d\n", sizeof(p));//4 p是地址
	printf("%d\n", sizeof(p + 1));//4 p+1也是地址
	printf("%d\n", sizeof(*p));//1 *p - 'a'
	printf("%d\n", sizeof(p[0]));//1  p[0] - 'a'
	printf("%d\n", sizeof(&p));//4 &p是地址
	printf("%d\n", sizeof(&p + 1));//4  &p + 1 跳过一个元素的地址
	printf("%d\n", sizeof(&p[0] + 1));//4 跳过一个元素的地址
	return 0;
}
int main()
{
	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));//随机值,&p是拿到p的地址,但是p和字符串abcdef是两块不同的内存空间
	printf("%d\n", strlen(&p + 1));//随机值
	printf("%d\n", strlen(&p[0] + 1));//5
	return 0;

}

三、二维数组

int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//12*4
	printf("%d\n", sizeof(a[0][0]));//4
	printf("%d\n", sizeof(a[0]));//16
	printf("%d\n", sizeof(a[0] + 1));//4 a[0]表示二维数组第一行的地址,第一行首元素的地址
	                                 //a[0]+1第一行第二个元素的地址也是地址
	printf("%d\n", sizeof(*(a[0] + 1)));//4
	printf("%d\n", sizeof(a + 1));//4 a是二维数组名,是第一行的地址,a+1是第二行的地址
	printf("%d\n", sizeof(*(a + 1)));//16,计算的是第二行的大小
	printf("%d\n", sizeof(&a[0] + 1));//4
	printf("%d\n", sizeof(*(&a[0] + 1)));//16 计算的是第二行的大小
	printf("%d\n", sizeof(*a));//16  第一行的地址解引用,拿到的是第一行
	printf("%d\n", sizeof(a[3]));//16
	return 0;
}

在这里插入图片描述

总结:
数组名的意义:

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址。

在这里插入图片描述

四、指针笔试题

4.1、笔试题1

int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };
	int* ptr = (int*)(&a + 1);
	printf("%d,%d", *(a + 1), *(ptr - 1));
	return 0;
}
//程序的结果是什么?

在这里插入图片描述

4.2、笔试题2

//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
	p = (struct Test*)0x100000; // 0000 0000 0000 0001 0000 0000 0000 0000 0000
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

在这里插入图片描述

4.3、笔试题3

int main()
{
	int a[4] = { 1, 2, 3, 4 };
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);
	printf("%x,%x", ptr1[-1], *ptr2);
	return 0;
}

在这里插入图片描述

4.4、笔试题4

int main()
{
	int a[3][2] = { (0, 1), (2, 3), (4, 5) };
	int* p;
	p = a[0];
	printf("%d", p[0]);
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Später321

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

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

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

打赏作者

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

抵扣说明:

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

余额充值