C语言学习笔记

97 阅读1分钟

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

如何规避野指针:

1.指针初始化

2.小心指针越界

3.指针指向空间释放即设置NULL

4.指针使用之前检查有效性

int main()
{
	int a = 10;
	int* pa = &a;//初始化
	int* p = NULL;//用来初始化的,给指针赋值
	return 0;
}

指针运算

1.指针+-整数

2.指针-指针

3.指针的关系运算

指针+-整数

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

指针-指针

指针减指针得到的是指针和指针之间的元素个数

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d\n", &arr[9] - &arr[0]);

	return 0;
}

利用指针减去指针实现求字符串的长度 

int my_strlen(char* str)
{
	char* start = str;
	char* end = str;
	while (*end != '\0')
	{

		end++;
	}
	return end - start;//指针减指针
}

int main()
{
	//strlen - 求字符串长度
	char arr[] = "bit";
	int len = my_strlen(arr);
	printf("%d\n", len);

	return 0;
}

指针的关系运算(比较大小)

规定:允许指向数组的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较

指针与数组

int main()
{
	int arr[10] = { 0 };
	printf("%p\n", arr);//地址 - 首元素的地址
	printf("%p\n", &arr[0]);
	return 0;
}

  1. &arr -&数组名 - 数组名不是首元素地址- 数组名表示整个数组 -&数组名 取出的是整个数组的地址\
  2. sizeof(arr) - sizeof(数组名) - 数组名表示的整个数组 - sizeof(数组名)计算的是整个数组的大小
int main()
{
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%p =========  %p\n", p + i, &arr[i]);
	}
	return 0;
}

其实p + i 计算的是数组arr下标为i的地址

那我们就可以直接通过指针来访问数组

二级指针

int main()
{
	int a = 10;
	int* pa = &a;
	int* * ppa = &pa;//ppa就是二级指针
	int** * pppa = &ppa; 

	return 0;
}

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

数组指针:指针