×

指针的指针

在C++中函数指针有什么作用呢,为什么不直接调用函数而要使用函数指针?C语言中的指针该怎么理解书上太难懂了,你能画图举例说下基本的指针操作吗

admin admin 发表于2022-07-26 22:02:12 浏览114 评论0

抢沙发发表评论

可以定义以下变量存储地址:p1 和 p2 就是C语言中所谓的指针类型,C语言指针的本质是内存变量,C语言有专门的数据类型存储地址(即所谓的指针),因此C语言程序的变量也是存在于内存中的,了解了C语言的指针类型和“ * ”运算符,C语言程序变量的地址也是一个整数,答案是:101,102,104,108.也就是每次指针移动一个变量类型对应的内存数,因为指针传递过去的是两个变量的地址。

在C++中函数指针有什么作用呢,为什么不直接调用函数而要使用函数指针

唉!不碰C++已经好几年了,这个问题唤起我许多感慨!看回答问题的都是程序猿高手们。

把我还记得的说一下,如果说的不对还请原谅,毕竟好几年没看书了。

指针是C语言最难学的概念,指针成为别有用心的人反对C语言的一个靶子。

其实,指针是一种特殊变量,它指向保存其他变量的地址,在调用函数时作为一个索引,用函数名作为函数本身。

指针占用的内存很少,好比C语言的一个轻骑兵。

在继承与遗传的自定义类时,使用虚函数的指针可以根据上下文自动判断并改变指针指向的父类或子类对象。

指针在程序调用完成后要及时撤销,避免内存泄漏。

C语言中的指针该怎么理解书上太难懂了,你能画图举例说下基本的指针操作吗

谢谢邀请。

“指针是C语言的灵魂,指针可以直接操作内存,指针使C语言程序更加高效”,等等等等。相信C语言初学者学到指针时,会看到很多这样描述指针的话,但是却往往一头雾水。

其实C语言的指针并没有什么难的,将其看做是一种类似于 char、int 的基本数据类型就简单了。

我在上个问答中提到C语言中的不同的基础数据类型主要区别之一就是占用的存储空间不同,程序是运行在计算机的内存中的,因此C语言程序的变量也是存在于内存中的。

C语言标准规定 char 类型占用一个字节的存储空间,对其他整型却没有做规定,现在为了解释的方便,我们假设 int 类型的数据占用内存 4 个字节。

假设我们如下定义了两个变量:

那么,i 占用了 1 字节的内存空间,j 占用了 4 字节的内存空间,请看下图。

方框表示内存空间,内部表示存储的值。我们把内存逐字节编号,方框外部的数字表示方框的编号(这样的内存“编号”即所谓的“内存地址”)。

修改变量 i 的值,实际上就是修改地址为 4000 的内存空间里的值。那反过来呢?如果我修改了地址为 4000 的内存空间里的值,i 的值会相应改变吗?答案是肯定的,请继续往下看。

上图中的内存地址“4000”是我为了解释方便随意取的。那么,在实际应用中,变量 i 的地址如何获取呢?C语言提供了“&”运算符,就是获取变量地址的。请看下面的例子:

我们取出了 i 的地址,把它强制转换为 long 型,传递给 p1 了。编译并执行这段C语言代码,得到如下输出:

发现变量 i 的地址被打印出来了,这说明,C语言程序变量的地址也是一个整数。

按照上面的说法,修改 i 的值除了直接对 i 赋值以外,还可以通过修改 p1 地址处的内存空间里的数值。那,怎样才能“通过修改 p1 地址处的内存空间里的数值”修改 i 的值呢?

上面的代码实例中使用了 long 型变量 p1 存储了 i 的地址。事实上,C语言有专门的数据类型存储地址(即所谓的指针),定义方式也很简单,就是:“类型描述符 * ”,例如,可以定义以下变量存储地址:-指针的指针

p1 和 p2 就是C语言中所谓的指针类型,因为 i 是 signed char 类型的,所以定义了 signed char * 类型的指针存储 i 的地址。j 是 int 类型的,所以定义了 int * 类型的指针存储 j 的地址。-指针的指针

另外,C 语言提供了“&”运算符取变量地址,与之对应的,还提供了“ * ”运算符从相应地址内存里取出数值。

了解了C语言的指针类型和“ * ”运算符,现在来看看如何“通过修改 p1 地址处的内存空间里的数值”修改 i 的值。请看如下C语言代码:

编译并执行,得到如下输出:

编译运行,发现程序输出“i=5”,这一值实际上就是通过指针修改的。可以看出,C语言中的指针并没有什么难的。

在定义变量时,” * “放在变量符号前,可以定义指针变量。在定义完指针变量后,“ * ”放在变量前,就表示从地址取值的运算符了。另外,“ * ”还可以表示乘法运算符,读者自己思考什么情况下,“ * ”表示乘法运算符。-指针的指针

可以看出C语言中的指针一点也不神秘。题主可以点我主页,查看我之前的文章,了解更多指针问题:比如为什么 int 类型的变量 j 的地址要使用 int* p2; 定义,而不能使用 signed char* p2; 定义,使用指针为何能写出紧凑、高效的 C语言程序等等。-指针的指针

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦

一直没明单片机C语言的指针这块内容,在什么情况下会用到指针呢

作为一名长期使用C语言进行开发的老司机,我来回答一下C语言指针的问题。

首先、C语言指针的本质是什么?

C语言指针的本质是内存变量,是内存单元的编号。内存单元是以字节为单位的。所以指针就是字节的编号。如下图所示,一个4G内存的编号,指针的值其实就是内存编号。

其次、搞清楚变量和指针的关系

变量对应的是具体的内存,变量的内容就是内存中保存的数据。

比如,我们定义一个变量uint8_t a=10,假如a的位置是0,也就是上图中0位置的内存中保存的数据是10;

我们再来看指针,定义指针uint8_t * b=&a,我们知道&的含义是取地址,那么根据上面的假设变量a位于地址0,那么&a也就是0,此时指针变量b的值也就是0.

如果不好理解指针定义uint8_t * b=&a,我们可以变通一下:

(uint8_t *) b =&a,把(uint8_t *) 当做一个新的数据类型就好理解了,其实我们实际的编程中,也通常会这么定义:typeof uint8_t * uint8_p-指针的指针

uint8_p b=&a;

这样 b就更像是一个变量了,理解起来更容易了。

第三、指针单元和内存

指针每个单元代表多少个内存呢?这要看指针的类型

比如,char * a,short int * b,int *c,long int * d等

指针所指的每份内存数量为1个字节,2个字节,4个字节,8个字节,也就是每个变量类型所占的内存单元。

假设a、b、c、d四个指针变量值均为100,分别做自加运算后,指针的值是多少呢?

a++;

b++;

c++;

d++;

你能猜出,a、b、c、d的值分别是多少吗?

答案是:101,102,104,108.

也就是每次指针移动一个变量类型对应的内存数,这个可以在keil 开发环境上面通过模拟环境验证,有兴趣的可以自行验证一下。

最后、指针的优势和应用场景

优势:

1.效率高;2、灵活,可以访问任意位置的内存数据;3、作为函数参数传递,只需要传递4个字节,比数组传值节省内存拷贝时间。

应用场景:

1.函数中交换两个变量的值

在学习函数时,交换两个数的值,做一个swap函数,传递值进去,也可以将两个值交换过来,没问题,可是离开swap就没有用了,为什么?因为传进去的是两个值。如果传递的是指针就没有问题。因为指针传递过去的是两个变量的地址,变量的位置不变。-指针的指针

2.函数通过指针返回多个值

3.函数返回运算的状态,结果通过指针返回

…………

指针的弊端

指针是C语言的灵魂所在,通常说C语言是“低级”语言的原因,很大程度上也是因为C语言指针的问题,C语言指针让开发者可以访问任意内存位置的数据。这是其他语音没有办法达到的。也正因为指针,C语言也很容易出错,最常见的问题是地址越界,如果地址越界,读写了不该读写的内容会直接导致系统崩溃,而且这种问题很难定位,因为语法上是没有错误的,编译的时候无法检查出来。-指针的指针

对于C语言指针的问题,大家有什么意见,欢迎留言讨论。