C语言指针

目录

指针

指针是什么

指针与指针类型

野指针

二级指针

指针和数组

指针数组

 数组指针

函数指针

 函数指针类型重定义

 回调函数 

 指针数组与数组指针​


指针

指针是什么

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向
(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元(一个字节。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

口头语指针为指针变量变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。

  • 在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
  • 那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。

指针与指针类型

  • 指针变量中只存放一个字节的地址,一个整形变量4个字节,并不是4个字节的地址都需要存储,而是仅存储第一个字节的地址。
  • 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。 比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
  • 指针的类型决定了指针向前或者向后走一步有多大(距离)。char*的指针+1跳过1个字节,int*的指针+1跳过4个字节。 

指针减指针为中间元素的个数。(必须为同类型)。 

野指针

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

野指针成因

  • 指针未初始化
  • 指针越界访问
  • 指针指向的空间释放 

二级指针

存放一级指针变量地址的指针 

指针和数组

数组名是数组首元素的地址。

两个例外:sizeof(数组名)和 &数组名、这里的数组名表示整个数组

sizeof(数组名) 计算的是整个数组的大小;

&数组名 取出的是整个数组的地址。 


指针数组

指针数组是数组, 数组中的元素为指针类型。

int* p[10], p是一个数组,数组每个元素为int*。

 数组指针

数组指针的定义

数组指针是指针,是指向数组的指针

例:int (*p)[10];
p是一个指针,指向一个10个元素的数组,数组中每个元素为int类型。

[]的优先级要高于*号的,所以必须加上()来保证p先和*结合 。

数组指针一般用于二维数组传参。

int arr[3][5],  int(*p)[5] = arr; 

二维数组可以理解为一维数组的数组,二维数组arr[3][5],

arr数组名为首元素地址,即arr=&arr[0], *arr得到数组首元素arr[0],

首元素为arr[0]为一维数组数组名, 数组名为首元素地址,即arr[0]=&arr[0][0]

函数指针

函数指针是指向函数的指针 。

函数名是函数的地址,&函数名 也是函数的地址。

void (*pfun1)();

pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。

通过函数指针调用函数时,* 可以省略。*(pfun1)() 等同于 pfun1()。

 函数指针类型重定义

函数指针类型重定义

typedef  void(*) (int)  pfun_t;

typedef  void( *pfun_t ) (int);

void (*signal(int , void(*)(int)))(int);  pfun_t signal(int, pfun_t);


数组指针类型重定义

typedef int(*)[10] parr_t;

typedef int(*parr_t)[10] ;

 回调函数 

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

  • 回调函数就是一个通过函数指针调用的函数
  • 回调函数一般通过函数指针实现
  • 回调函数一般不是函数的实现方调用,而是在特定的场景下,由另外一方调用

 指针数组与数组指针

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值