C语言学习笔记(数组指针试题)

210 阅读1分钟

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

 题目八:

//二维数组
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;
}

//48 344

//4

//16 4*4 a[0]相当于第一行作为一维数组的数组名,sizeof(arr[0])把数组名单独放在sizeof()内,计算的是第一行的大小 

// 4 - a[0]是第一行的数组名,数组名此时是首元素的地址,a[0]其实就是第一昂第一个元素的地址,所以a[0] + 1就是第一行第二个元素的地址,地址大小是4/8个字节

//4 - *(a[0] + 1) 是第一行第二个元素,大小是4字节

//4 a是二维数组的数组名,没有sizeof(数组名),也没有&(数组名),所以a是首元素地址  而把二维数组看成一维数组时,二维数组的首元素是他的第一行,a就是第一行(首元素)的地址    //a+1就是第二行的地址

//16 sizeof(a[1]) 计算第二行的大小,单位是字节

//4 第二行的地址 

//16 计算第二行大小

//a是首元素地址,就是第一行的地址 sizeof(*a)就是计算第一行的大小

//16

总结:

1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小

2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址

3.除此之外所有的数组名都表示首元素的地址

指针笔试题:

题目一:

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

答案:2,5

取数组地址再加一,跳过整个数组

题目二:

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;
	printf("%p\n", p + 0x1);
	printf("%p\n",(unsigned long) p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);

	return 0;
}

答案: 0x00100014  0x00100001  0x00100004

指针加减整数的计算,取决于指针类型

题目三:

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

ptr1[-1] = ptr+(-1)

答案:4  2000000