C言语作为嵌入式开发的根底言语现已越来越让工程师们知道它的凶猛:能够直接控制寄存器,便利CPU的功用设置;能够直接操作物理地址,并进行位的操作从而到达硬件的操作等等。假如你用8位16位单片机进行开发学习,信任运用一些程序技能能够完结规划:循环、挑选、位操作、条件判别、数组和程序嵌套等。假如你进行操作系统,重视操作系统的内核(以linux为例),你就会发现这些C言语是其间的一小部分。关于操作系统来说更多运用到指针,究其原因,一个很重要的原因便是处理速度快。那么,今日我就把C言语的指针做个总结。
榜首、 指针和常数
关于学习过指针的同学都知道,常数是不能直接幅值给指针的,假如想给指针幅常数,需求如下操作:
int num=8;
int *pnum=#
这时咱们需求留意,pnum指向8存储的地址,*pnum为该地址存储的数据8。
第二、 指针和数组
指针和数组有着天然的联络,其实数组便是一个接连地址寄存着常数,咱们看下面一个比如:
int arry[3]={1,3,5};
那么arry便是该数组的首地址,*arry便是该数组首地址寄存的数据1,*(arry+1)则为该数组的第二个方位寄存的数据3.
从以上剖析能够看出:
*arry和arry[1]相同指向该数组的首个元素。
那么能够在进一步延伸,如下:
a 、int *data[3] 为指针数组,数组中每个元素为一个指向int型数据的指针,赋值如下:
int arry[3]={1,3,5};
int *data[3]={arry,arry+1,arry+2};
data[0]为指向arry首地址,*data[0]为该地址寄存的数据1。data为data数组的首地址,*data和data[0]都为数组arry的首地址。其实也能够说界说了三个数组 data[0], data[1]和data[2]。
b、int(*data)[3]为一数组指针,为一数组,每个元素为寄存一个地址,赋值如下:
int arry[3]={1,3,5};
int (*data)[3]=&arry;
那么*data就为榜首个元素的地址,**data就为榜首个地址地点的元素1。
看到这儿,你是不是现已感受到指针的趣味了?更风趣的还在下面,喝杯水,持续剖析。
第三、 指针与结构体
这个也是一个很风趣的方面,先看一个比如:
struct PERSON
{
char *pername;
int age;
}person;
假如想给*pername幅值,那么能够如下操作:
person.pername="jack";//用指针,能够完结赋值
假如结构体界说为
struct PERSON
{
char pername[20];
int age;
}person;
那么person.pername[20]="jack"是不能通过的,究其原因便是结构体为抽象数据类型,不分配存储单元,所以数组赋值不通过。假如选用指针赋值,那么能够处理这类问题。
第四、 指针与函数
指向函数的指针在linux操作系统中很常见,现在拿个简略的比如来进行阐明:
int print(int a, int b ,char *p)
{ printf("in put number sum is %d,input string is %s\n",a+b,p);//三个参数,int int和char*
return a+b;}
int main()
{
int (* pprint)(int,int,char *);//界说指向函数print的指针函数*pprint,三个参数,int int和char*
pprint=print;//给指针函数赋值
int c;
c=pprint(3,6,var);
printf("%d\n",c);//输出print的return值
}
从上面这个比如中能够看出,一个函数其实便是从一个地址开端的特别功用程序,其函数名就为该程序的首地址,所以能够这么给指针函数赋值:pprint=print;//给指针函数赋值
通过以上啰嗦,信任你对指针有了更深化的知道,在实践的工作中不仅仅是这么简略的问题,假如你是做纯软件开发,那么功率永远是榜首位的,那么,你就要好好的使用指针这个东西了。
linux操作系统文章专题:linux操作系统详解(linux不再难明)