c中指针简介

c中指针简介

首先我们来看一下指针的一些基本概念
![在这里插入图片描述](https://img在这里插入图片描述
而对于指针的应用,平常有一些形式,总结了一下大概有这几种用法
在这里插入图片描述
对于以上的几种用法,我依次给出详尽的解释
//这是一个普通的整型变量

1 //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针

2 //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组

3 //首先从P 处开始,先与[]结合,因为其优先级比高,所以P 是一个数组,然后再与结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组

4 //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针**

5 //首先从P 开始,先与结合,说是P 是一个指针,然后再与结合,说明指针所指向的元素是指针,然后再与int 结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针.

6 从P 处起,先与()结合,说明P 是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数,然后再与外面的 int 结合,说明函数的返回值是一个整型数据

7 //从P 处开始,先与指针结合,说明P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P 是一个指向有一个整型参数且返回类型为整型的函数的指针**

8 //可以先跳过,不看这个类型,过于复杂从P 开始,先与()结合,说明P 是一个函数,然后进入()里面,与int 结合,说明函数有一个整型变量参数,然后再与外面的结合,说明函数返回的是一个指针,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数.**

接下来我们具体来看一些指针类型

字符指针

在这里插入图片描述
还有一种方式是把字符串的首地址放到字符指针中
在这里插入图片描述
那么会有这样的一个问题
在这里插入图片描述
上述程序的结果如下图,为什么不一样呢?
在这里插入图片描述
这里str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指
针。指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候
就会开辟出不同的内存块。所以str1和str2不同,str3和str4不同。

指针数组

在这里插入图片描述

数组指针

在这里插入图片描述
我们来看一段代码
在这里插入图片描述
他的运行结果为
在这里插入图片描述
所以我们会得出一个结论,那就是数组名和&数组名打印的地址是一样的
但是真的是一样的吗?
我们再来看一段代码
在这里插入图片描述
再来看看他们的打印的结果
在这里插入图片描述
那么为什么会这样呢?
其实,其实&arr和arr,虽然值是一样的,但是意义应该不一样的。
实际上: &arr 表示的是数组的地址,而不是数组首元素的地址。所以&arr+1其实是取了整个数组的地址并跳过了整个数组
数组的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40.

数组指针具体如何使用,用一个代码来具体体现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
指针除了上述的一些引用外,最主要的是用于函数的参数
数组参数,指针参数
一维数组传参
在这里插入图片描述
在这里插入图片描述
以上的形式都是合理定义参数的方法
二维数组传参
在这里插入图片描述
一级指针传参
在这里插入图片描述
二级指针传参
在这里插入图片描述
我们来看一下一段代码

在这里插入图片描述
我们可以看,第一次调用时传的时pc指针的地址,而本身pc这个变量是(char *)类型,所以传pc的地址,就需要用char **来接受,而第三次传参时,因为arr是一个指针数组,它每一个元素存的是一个指针,但传它的数组名,也就是传首元素的地址,其实也就是一个一级指针,所以传它的地址也就是传二级指针,所以没有问题。

函数指针

在这里插入图片描述
运行结果为
在这里插入图片描述
输出的是两个地址,这两个地址是 test 函数的地址。 那我们的函数的地址要想保存起来,怎么保存?
我们就可以用函数指针
在这里插入图片描述
首相要存地址,必须是指针,所以pfun1可以,因为pfun1先和*结合再指向一个函数,函数无返回值。

函数指针数组

那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?
在这里插入图片描述
首先parr1先和【】结合,说明parr1是数组,数组的内容是什么呢? 是 int (*)() 类型的函数指针
函数指针数组的用途:转移表

指向函数指针数组的指针

指向函数指针数组的指针是一个 指针 指针指向一个 数组 ,数组的元素都是 函数指针 ;
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值