c语言_Day22_07_23

一、指针

1、指针运算

1、关系运算

指针可以比较大小:c语言标准指出允许数组元素的指针与指向数组最后一个元素的后面的内存位置进行比较,但不允许与指向数组第一个元素的前面的内存位置进行比较

int main()
{
	int arr[] = { 1,2,3,4,5 };
	int* p;
	for (p = &arr[5]; p > &arr[0];)
	{
		*--p = 0;
	}

	return 0;
}

2、指针与数组

数组名为数组首元素的指针,但存在两个例外

  1. &数组名时返回整个数组的地址

  2. sizeof操作符运算时返回整个数组的大小

int main()
{
	int arr[10] = { 0 };
	printf("%d\n", arr == &arr[0]);
	printf("%d\n", &arr + 1 == &arr[10]);
	printf("%d\n", sizeof arr);

	return 0;
}

大部分情况,数组名即为数组首元素的指针,故指针可以很好的操纵数组

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	int* p = arr;
	int length = sizeof arr / sizeof arr[0];
	for (int i = 0; i < length; i++)
	{
		printf("&arr[%d] = %p <=====> p + %d = %p\n", i, &arr[i], i, p + i);
	}

	return 0;
}

3、二级指针

二级指针:保存指针的地址的指针

int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;
	printf("*pp = %p\n", *pp);
	printf("p = %p\n", p);
	**pp = 20;
	printf("%d\n", a);

	return 0;
}

4、指针数组

指针数组:存放指针的数组