指针的介绍

一.简介指针

1.指针变量

内存单元(一个字节)的编号可以称为地址地址也可以称为指针。,指针相当于一个门牌号,而号码是由每位的1和0组成,通过号码就可以找到对应的空间。

下面我们进行一下联想:

整形变量是存放整数值

字符变量就是存放单个字符的

指针变量就是存放指针(地址)的

2.指针变量的大小

而指针在32位平台4个字节,而在64位(bit)平台8个字节。地址有多大,其指针变量就有多大。(单位:字节(byte))。

指针的算术运算:指针可以进行算术运算,如递增(++)和递减(--),这些运算可以改变指针指向的内存地址。

2.野指针

就是指针变量没初始化或者指向已经释放的空间,这也可以理解为野指针。而面对野指针,我们在用的时候,要么初始化,要么赋值--NULL,可以表示0地址处,但是你给指针变量赋了NULL时,你不能去访问这个地址,他会报错的。

二.一级指针与二级指针

一级指针是指向变量,常量,以及数组元素的指针,二级指针就是指向一级指针的指针,例如:

int n = 0;
int* p = &n;
int** pp = &p;

int* p是一个一级指针*说明它是一个指针int表示它指向的类型int* 是它的类型,其实除了变量名,其他的都是类型int*表示它指向的类型第二个*表明它是一个指针。这为啥讲类型呢。

我举的例子是把一个十六进制的数赋给变量a,变量a是四个字节,也就是32位,十六进制的两位表示一个字节。

从上面可知我们指针变量p中其实存的是变量a的低地址也就是存放十六进制18内存单元的地址,而类型告诉一个变量访问几个字节(内存单元),printf("(int*) = %X (char*) = %X", *p, *(char*)p);第一个*pint*访问4个字节,第二个我进行了强制类型转换,int*转换为char* ,那他就是访问1个字节的空间。所以是后面的值。

那么下面的我想你一定也明白了

当然不止二级还有三级等,这里就不太详细的书写了。

三.指针数组

char* name[3] = {"wang", "liu", "tang"};

由于[的优先级较高,故name先与[结合,故它是数组,这是和数组指针的不同点,当你去调用要写成数组的形式,这以突出它是数组嘛。

它里面是放的地址,那么我是不是可以放和地址有关的,下面我们来看看吧

四.数组指针

其实在区分指针数组和数组指针的时候你就看后面的两个字,这也是好区分的。

它是一个指向数组的指针,可以理解为把数组的地址拿出来放到数组指针变量中,那么便可以这样写

int  array_number[] = { 1, 2, 3, 4};
int (*pm)[4] = &array_number;

(*pm)中pm先与*结合,故它是指针,指向一个数组,数组4个元素,每个元素是int类型。是不是数组的真实写照。

"&数组名",拿出的是数组的地址,数组名好像是首元素的地址吧,在一开始我也有一点不是很理解数组名和&数组名,其实,它们都是指向首元素的地址,只不过它们的类型不一样罢了。

我用了两个指针,分别进行了比较,指针的类型就是指向元素的类型。

刚才讲了类型其实是什么,那么对pmpn1,我想你们也一定知道。

想必大家也了解了数组指针和指针数组,那我们来深入一下,数组指针数组。这该咋理解呢,先看图

      

int(*pf[1])[4] = { pm };还是和理解指针数组那样,pf先与[]结合,说明pf数组,那么剩下的即是类型int(*)[4] = { pm };这是一个指针数组。将pm存放在数组指针数组中,我们通过pf[0]找到pm,对于pm它是一个指针,第一个*找到array_number这个数组的地址,然后*这是找到这个数组,也就是首元素的地址

那指针数组指针呢?我想你们一定也会,不妨可以来分析一下

五.函数指针

函数指针,就是指向函数的指针,本质上是指针。

int add(int x, int y)
{
    return x + y;
}

int  main(void)
{
    int (*function)(int, int) = &add;
    
    int num = function(4, 5);
    printf("%d\n", num);
    return 0;
}

这是一个函数指针的写法,对于函数,函数名就是其地址,故&可以忽略。那么function中放的就是add函数的地址 那便可以进行调用。

结语

对最近学的做一个总结吧,如果大家还知道那些关于指针的知识,欢迎大家的在评论区留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值