嵌入式C语言记录(一)[ ]和*和&的简单应用

问题出现在FreeRTOS系列(四)中
今天看视频发现下面两段代码效果一样,发现自己对指针和地址的概念还是不清晰,于是决定深入了解一下C语言中的指针和地址

pxTopOfStack = &(pxNewTCB->pxStack[ulStackDepth - ( uint32_t ) 1]);
pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 );

那么为什么会出现这个情况呢?

(7条消息) 地址、指针、指针变量详解_指针地址_CD4356的博客-CSDN博客

上面可以去详细了解地址、指针和指针变量一下

//pvPortMalloc 函数用于动态分配内存,并返回分配的内存起始地址。在这种情况下,pvPortMalloc 分配的内存大小为 (usStackDepth * sizeof(StackType_t)),即 usStackDepth 乘以 sizeof(StackType_t) 的字节数。
pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) );

//将pxStack变量的值赋给了pxNewTCB->pxStack,即将堆栈的地址存储在TCB的pxStack成员变量中。
pxNewTCB->pxStack = pxStack;

//这里的效果和pxTopOfStack = &(pxNewTCB->pxStack[ulStackDepth - ( uint32_t ) 1])一样,都是对
pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 );
pxTopOfStack = &(pxNewTCB->pxStack[ulStackDepth - ( uint32_t ) 1]);

在第一个表达式中,pxTopOfStack被赋值为pxNewTCB->pxStack + (ulStackDepth - (uint32_t) 1)这表示将pxNewTCB->pxStack的指针加上(ulStackDepth - (uint32_t) 1)个元素大小的偏移量,得到的结果存储在pxTopOfStack中。这通常用于计算任务堆栈的顶部位置。

pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 );

在第二个表达式中,&(pxNewTCB->pxStack[ulStackDepth - (uint32_t) 1])表示取pxNewTCB->pxStack数组中索引为ulStackDepth - (uint32_t) 1的元素的地址,并将其赋值给pxTopOfStack这实际上也是计算任务堆栈的顶部位置。

参考:(7条消息) 解析C中 [ ] 操作符_c语言[]_追道者的博客-CSDN博客

C语言中p[q] 等价于 *(p+q),所以这里(pxNewTCB->pxStack[ulStackDepth - (uint32_t) 1])=

*(pxNewTCB->pxStack + (ulStackDepth - (uint32_t) 1))这里表示的是取这个地址的值,需要地址的话只需要给这个整体加上*取地址符即可。

&(pxNewTCB->pxStack[ulStackDepth - (uint32_t) 1])

pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 );

这里顺带介绍一下

*和&

*:取值符

*用于取这个地址里面的存储的值

&:取地址符

&用于取出想要变量的地址

因此,这两个表达式的作用是相同的,都是获取任务堆栈的顶部位置的地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值