刚开始看OSTaskDel (INT8U prio)这个任务删除函数时,里面的一段代码有点蹊跷。
if (ptcb->OSTC————BPrev == (OS_TCB *)0)//任务块双向链接表的前链接是否Null
{
ptcb->OSTCBNext->OSTCBPrev= (OS_TCB*)0;//删除该任务的任务控制块OS_TCB
OSTCBList= ptcb->OSTCBNext; //链接表指向后一个链接
}
else
{
ptcb->OSTCBPrev->OSTCBNext= ptcb->OSTCBNext; // ?
ptcb->OSTCBNext->OSTCBPrev= ptcb->OSTCBPrev; // ?
}
先看一个例子
#include <stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int * i,* j,a[4]={1,2,3,4};
i = a;// i 内容存放a 这个地址,注意,不是把a
//里面存放的内容直接存入i内容里
j = i;// j 内容存放i 这个地址
if ( (j==i)&&(j = =a)&&(*j = = 1) )
{
printf(" truen");
}
else
{
printf(" falsen");
}
system("PAUSE");
return 0;
}
在这里*i = *j = a[1] = 1。
指向地址的变量本应是指向指针的指针变量。程序改为如图所示,*j 存放的内容是i的内容,也就是a 这个地址,而*i存放的内容就是a[1]的内容也就是1,画图的话是很容易的。
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int * i,** j,a[4]={1,2,3,4};
i=a;//a是一个地址,i存放的内容是a
j=(int **)i;//i 是一个地址,j存放的内容是i
if ((int*)j == (int *)a ) //此处地址类型必须一致
{
printf(" truen");
}
else
{
printf(" falsen");
}
system("PAUSE");
return 0;
}