C语言学习笔记——指针与数组题目解析

129 阅读3分钟

​「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」。

前面我们已经详细学习过了指针与数组,为了巩固所学,我们来几道题目练练手

  题目一:


int main()
{	//数组名是首元素的地址
	//1.sizeof(数组名) - 数组名表示整个数组
	//2.&数组名 - 数组名表示整个数组
	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;
}

解析:  

//数组名是首元素的地址

//1.sizeof(数组名) - 数组名表示整个数组

//2.&数组名 - 数组名表示整个数组

//sizeof(数组名) - 计算的是数组总大小 - 单位是字节 - 16

//4 - 数组名这里表示首元素地址,a+0还是首元素地址,地址大小就是4/8个字节

//4 - 数组名表示首元素地址,*a就是首元素,sizeof(*a)就是4

//4 - 数组名这里表示首元素地址,a+1是第二个元素的地址,地址的大小就是4/8个字节

//4 - 第二个元素的大小

//4 &a取出的是数组的地址,但是数组的地址也是地址,地址的大小就是4/8个字节

//16 - &a是数组的地址,数组的地址解引用访问数组,sizeof计算的就是数组的大小,单位是字节

//4/8 &a是数组的地址,&a+1虽然地址跳过整个数组,但还是地址

//4/8 &a[0]是第一个元素的地址

//4/8 第二个元素的地址

题目二: 

//字符数组
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));

解析:

// 6 sizeof计算的是数组大小 6*1=6

//4/8 arr是首元素的地址,arr+0还是首元素的地址 地址的大小是4/8字节

//1 arr是首元素地址,*arr是首元素,首元素是字符,大小是一个字节

//1

//4 &arr虽然是数组的地址,但还是地址,地址的大小是4/8个字节

//4 &arr+1是跳过整个数组后的地址,地址大小是4/8个字节

//4 第二个元素的地址

题目三: 

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

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));

//随机值 \0的位置不确定

//随机值

//err

//err

//随机值

//随机值

//随机值

//随机值

题目四:

int main()
{
	char arr[] = "abcdef";

	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));


	return 0;
}

解析:

//7 a b c d e f \0 7个字符 7*1=7 sizeof计算的数组的大小。单位是字节

//4/8计算的是地址的大小 arr+0是首元素的地址

//1 *arr是首元素,sizeof(*arr)计算首元素大小

//1 arr[1]是第二个元素,sizeof(arr[1])计算的是第二个元素的大小

//4 &arr虽然是数组的地址,但也是地址,所以是4/8个字节

//4/8 &arr+1是跳过整个数组后的地址,但也是地址

// 4/8 &arr[0]+1 第二个元素的地址