原创

C语言指针的知识

温馨提示:
本文最后更新于 2022年06月17日,已超过 9 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

指针

指针是什么?

指针是一个变量,用来存放内存单元的地址(是一个编号)

  • 一个内存单元大小为1个字节
  • 一个指针的大小在32位的机器上为4个字节,在64位是机器上为8个字节

指针类型

什么是指针的类型呢?举一个例子:

int i = 10;

在这个例子中我们知道i是这个整型变量的名字10是整型变量的值,既然我们向内存申请了一个空间,那我们是不是要有相应的地址来存放这个值呢,就像我们每一个人都有一个家一样,既然这样,那是不是我们就应该考虑,这个指针的类型和变量有关呢,那我就规定在变量类型的前面加一个*来表示这个指针的类型,那么上述例子中存放i变量的指针类型就int*
如此类推有char*,long*,double*…了。

野指针

概念:指针指向的位置是不可知的,未知的,随机的,不正确的,没有明确限制的…
野指针是经常出现的一个程序错误,因为他出现的情况很多,出现野指针的时候,有的时候程序会报错,但是有的时候,野指针很难被发现,这时我们的程序就不会报错,但是,会造成程序崩溃。

经常出现野指针的情况

  • 指针使用的时候未初始化,当我们申明的一个变量未初始化的时候,这个变量就是一个随机值,当然指针变量也是如此,他是一个随机地址,随机地址无法使用
  • 指针的越界访问:当我们访问指针的时候如果超出指针的所指向的那块内存空间,那么就会造成指针的越界访问
//eg
int main()
{
	int arr[10]={0};
	int i =0;
	for(i=0;i<11;i++)
	{
		*arr = 10;
		arr++;
	}
	return 0;
}

这就是典型的指针越界访问

如何规避野指针

  • 指针初始化的时候,如果不知道用啥都话就用NULL来初始化(NULL表示的是空值的意思)
  • 小心指针越界:我们在访问指针的时候不能访问出界,不然就会出现问题
  • 指针指向空间说空间如果不在了的话可以把指针置为空*p = NULL
  • 使用指针之前检测指针是不是空指针,空指针无法使用
int main()
{
    int a =10;
    int* p =&a;
    printf("%p\n",p);
    p = NULL;
    printf("%p",p);
    return 0;
}

指针的运算

  • 指针±整数
int main()
{
    int arr[]={1,2,3,4,5,6,7,8,9,10};
    int sz = sizeof(arr)/sizeof(arr[0]);
    int* p = arr;
    for(int i = 0; i<sz; i++)
    {
        printf("%d,",*p);
        printf("%p\n",p);
        p++;
    }
    return 0;
}
//输出数字
  • 指针-指针
int main()
{
    int arr[]={1,2,3,4,5,6,7,8,9,10};
    printf("%p\n",&arr[4]);
    printf("%p\n",&arr[1]);
    &arr[4]-&arr[1];
    printf("%d\n",&arr[4]-&arr[1]);
    return 0;
}
//输出的结果为3,两元素之间的元素个数

:这里的指针-指针运算必须是在同一组数据之中,不然这个运算将毫无意义

  • 指针的关系运算
    所谓指针的关系运算实际上就是指针和指针之间通过算数关系符号连接的运算**<,><=,>=,!=**,指针和指针之间的比较

指针和数组

  1. &arr 的时候不是首元素的地址,而是整个数组的地址,但是打印的时候是从第一个开始显示的
  2. sizeof(arr),不是数组的首元素地址,其他的情况都是首元素地址

二级指针…

int main()
{
    int a = 10;
    int * pa = &a;//一级指针:int
    int* * ppa = &pa;//二级指针:int*
    int** * pppa = &ppa;//三级指针:int**
    //...
    //如果要通过pppa打印a的值
    printf("%d\n",***pppa);//10
    return 0;
}

指针数组

数组,存放指针的数组

# include<stdio.h>
int main()
{
    int a =10;
    int b = 20;
    int c = 30;
    // int* pa = &a;
    // int* pb = &b;
    // int* pc = &c;
    int* arr[3] = {&a,&b,&c};//指针数组
    return 0;
}

数组指针

数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针。

正文到此结束