深层解密C语言的指针

来源:本站
导读:目前正在解读《深层解密C语言的指针》的相关信息,《深层解密C语言的指针》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《深层解密C语言的指针》的详细说明。
简介: C语言作为嵌入式开发的基础语言已经越来越让工程师们知道它的厉害:可以直接操控寄存器,方便CPU的功能设置;可以直接操作物理地址,并进行位的操作进而达到硬件的操作等等。如果你用8位16位单片机进行开发学习,相信使用一些程序技术可以完成设计:循环、选择、位操作、条件判断、数组和程序嵌套等。

第一、 指针和常数

对于学习过指针的同学都知道,常数是不能直接幅值给指针的,如果想给指针幅常数,需要如下操作:

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 %sn",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("%dn",c);//输出print的return值

从上面这个例子中可以看出,一个函数其实就是从一个地址开始的特殊功能程序,其函数名就为该程序的首地址,所以可以这么给指针函数赋值:pprint=print;//给指针函数赋值

经过以上唠叨,相信你对指针有了更深入的认识,在实际的工作中不仅仅是这么简单的问题,如果你是做纯软件开发,那么效率永远是第一位的,那么,你就要好好的利用指针这个工具了。

提醒:《深层解密C语言的指针》最后刷新时间 2024-03-14 01:02:46,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《深层解密C语言的指针》该内容的真实性请自行鉴别。