C语言学习笔记(指针题目)

140 阅读1分钟

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

题目四:

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

解析:

逗号表达式,结果是最后一个表达式结果 - (0,1)结果为1,(2,3)结果为3,(4,5)结果为5

​​

 后几位自动用0补齐

 答案:1

题目五:

int main()
{
	int a[5][5];
	int(*p)[4];
	p = a;
	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);

	return 0;
}

解析:

p[4][2] = (*(p + 4) + 2)

+4 — 跳过4个整型 

地址 - 地址 = 两个地址之间的元素个数

答案:FFFFFFFC   -4

题目六:

int main()
{
	int aa[2][5] = { 1,2,3,4,5,6,7,8,9,10 };

	int* ptr1 = (int*)(&aa + 1);
	int* ptr2 = (int*)(*(aa + 1));

	printf("%d,%d\n", *(ptr1 - 1), *(ptr2 - 1));
	return 0;

}

解析:

aa[1] - 第二行首元素地址

答案:10,5

几个相等的表达方式:

	int arr[10] = { 1,2,3,4,5 };
	int* p = arr;
	*(p + 2) == p[2] == * (arr + 2) == arr[2]

题目七:

int main()
{
	char* a[] = { "work","at","alibaba" };
	char** pa = a;

	pa++;
	printf("%s\n", *pa);
	return 0;
}

解析:

char* p = "abcdef";//字符指针,把常量字符串首字符的地址a放到p中

pa++指向第二个元素

答案:at

题目八:*

int main()
{
	char* c[] = { "ENTER","NEW","POINT","FIRST" };
	char** cp[] = { c + 3,c + 2,c + 1,c };
	char*** cpp = cp;

	printf("%s\n", **++cpp);
	printf("%s\n", *--*++cpp + 3);
	printf("%s\n", *cpp[-2] +3);
	printf("%s\n", cpp[-1][-1] + 1);


	return 0;
}

解析:

printf中的++是真实存在的(前后有关联关系,cpp在+的时候在发生变化)

*cpp[-2]+3 == * *(cpp+(-2)) +3

cpp[-1][-1]+1 == *( *(cpp-1) -1 ) +1

答案:POINT, ER, ST, EW

​​

题目九:

int main()
{
	unsigned long pulArray[] = { 6,7,8,9,10 };
	unsigned long* pulPtr;
	pulPtr = pulArray;
	*(pulPtr + 3) += 3;
	printf("%d,%d\n", *pulPtr, *(pulPtr + 3));
	return 0;
}

答案:6,12

​题目十:

下面关于指针运算说法镇古鳄的是:()

A.整型指针+1,指针偏移一个字节

B.指针-指针得到的是指针与指针的字节个数

C.整型指针解引用操作访问四个字节

D.指针不能比较大小

答案:C

解析:

A.指针偏移一个整型大小

B.得到的是指针与指针之间的元素个数

D.指针可以比较大小