C语言-指针(初阶)

1.野指针

概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

1.1野指针成因

1.指针未初始化

#include 
int main()
{
int *p;//局部变量指针未初始化,默认为随机值
  *p = 20;
return 0;
}

2.指针越界访问

#include 
int main()
{
  int arr[10] = {0};
  int *p = arr;
  int i = 0;
  for(i=0; i<=11; i++)
 {
    //当指针指向的范围超出数组arr的范围时,p就是野指针
    *(p++) = i;
 }
  return 0;
}

3.指针指向的空间释放

1.2如何规避野指针

1.指针初始化

2.小心指针越界

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

4.避免返回局部变量的地址

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

#include 
int main()
{
  int *p = NULL;
  //....
  int a = 10;
  p = &a;
  if(p != NULL)
 {
    *p = 20;
 }
  return 0;
}

2.指针运算

指针+- 整数
指针-指针
指针的关系运算

2.1指针+-整数

C语言-指针(初阶)_第1张图片

2.2指针-指针

指针-指针得到的是两个指针之间的元素个数
指针-指针的前提:两个指针要指向同一块空间

 俩指针指向同一块空间:C语言-指针(初阶)_第2张图片

俩指针分别指向不同的空间:

C语言-指针(初阶)_第3张图片

指针-指针应用:

#include 
int my_strlen(char* str)
{
	char* start = str;   //把arr[0]存给*start
	while (*str != '\0')
	{
		str++;
	}
	return str - start;  //指针-指针得到两个指针之间的元素个数
	//指针-指针(前提是这两个指针要指向同一空间)
}
int main()
{
	char arr[] = "abcde";
	int len = 0;
	len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

2.3指针的关系运算

for(vp = &values[N_VALUES]; vp > &values[0];)
{
  *--vp = 0;
}

 代码简化, 这将代码修改如下:

for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{
  *vp = 0;
}

实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。

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

3.指针和数组

用指针访问数组:

C语言-指针(初阶)_第4张图片

C语言-指针(初阶)_第5张图片

 可以看出来P+i,i为数组的下标。

4.二级指针

C语言-指针(初阶)_第6张图片

我个人认为 二级指针有点像  复合函数  一层套着一层

对于二级指针的运算有:
*ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa .

int b = 20;
*ppa = &b;//等价于 pa = &b;

**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a .

**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;

5.指针数组

实际上是个数组,数组里的元素为指针。

int * arr[5];

arr是一个数组,有五个元素,每个元素是一个整形指针。

你可能感兴趣的:(C语言,c语言,c++,开发语言,指针)