我是靠谱客的博主 坚强自行车,最近开发中收集的这篇文章主要介绍C语言指针和数组笔试题一、一维数组二、字符数组三、二维数组四、指针笔试题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

32位环境下

一、一维数组

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

二、字符数组

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

在这里插入图片描述

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

int main()
{
	char arr[] = "abcdef";
	printf("%dn", strlen(arr));//6
	printf("%dn", strlen(arr + 0));//6
	printf("%dn", strlen(*arr));// 报错
	printf("%dn", strlen(arr[1]));// 报错
	printf("%dn", strlen(&arr));//6
	printf("%dn", strlen(&arr + 1));//随机值
	printf("%dn", strlen(&arr[0] + 1)); //5
	return 0;
}

在这里插入图片描述

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

}

三、二维数组

int main()
{
	int a[3][4] = { 0 };
	printf("%dn", sizeof(a));//12*4
	printf("%dn", sizeof(a[0][0]));//4
	printf("%dn", sizeof(a[0]));//16
	printf("%dn", sizeof(a[0] + 1));//4 a[0]表示二维数组第一行的地址,第一行首元素的地址
	                                 //a[0]+1第一行第二个元素的地址也是地址
	printf("%dn", sizeof(*(a[0] + 1)));//4
	printf("%dn", sizeof(a + 1));//4 a是二维数组名,是第一行的地址,a+1是第二行的地址
	printf("%dn", sizeof(*(a + 1)));//16,计算的是第二行的大小
	printf("%dn", sizeof(&a[0] + 1));//4
	printf("%dn", sizeof(*(&a[0] + 1)));//16 计算的是第二行的大小
	printf("%dn", sizeof(*a));//16  第一行的地址解引用,拿到的是第一行
	printf("%dn", 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("%pn", p + 0x1);
	printf("%pn", (unsigned long)p + 0x1);
	printf("%pn", (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;
}

在这里插入图片描述

最后

以上就是坚强自行车为你收集整理的C语言指针和数组笔试题一、一维数组二、字符数组三、二维数组四、指针笔试题的全部内容,希望文章能够帮你解决C语言指针和数组笔试题一、一维数组二、字符数组三、二维数组四、指针笔试题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部