指针 指针的指针的作用

所谓函数类型是指函数返回值的类型。
利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。
在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。内存单元的指针和内存单元的内容是两个不同的概念严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,我们中约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。定义指针的目的是为了通过指针去访问内存单元。既然指针变量的值是一个地址,那么这个地址不仅可以是变量的地址,也可以是其它数据结构的地址。在一个指针变量中存放一个数组或一个函数的首地址有何意义呢?因为数组或函数都是连续存放的。通过访问指针变量取得了数组或函数的首地址,也就找到了该数组或函数。这样一来,凡是出现数组,函数的地方都可以用一个指针变量来表示,只要该指针变量中赋予数组或函数的首地址即可。这样做,将会使程序的概念十分清楚,程序本身也精练,高效。在C语言中,一种数据类型或数据结构往往都占有一组连续的内存单元。用“地址”这个概念并不能很好地描述一种数据类型或数据结构,而“指针”虽然实际上也是一个地址,但它却是一个数据结构的首地址,它是“指向”一个数据结构的,因而概念更为清楚,表示更为明确。这也是引入“指针”概念的一个重要原因。变量的指针就是变量的地址。存放变量地址的变量是指针变量。即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”,例如,i_pointer代表指针变量,而*i_pointer是i_pointer所指向的变量。因此,下面两个语句作用相同: i=3; *i_pointer=3;
指针 指针的指针的作用
指针类型说明,即定义变量为一个指针变量;指针变量名;变量值(指针)所指向的变量的数据类型。其一般形式为:类型说明符 *变量名;其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。
例如: int *p1;表示p1是一个指针变量,它的值是某个整型变量的地址。或者说p1指向一个整型变量。至于p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定。
再如: int *p2; float *p3; char *p4;
应该注意的是,一个指针变量只能指向同类型的变量,如P3只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量。
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误。在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。两个有关的运算符:&:取地址运算符。*:指针运算符(或称“间接访问” 运算符)。C语言中提供了地址运算符&来表示变量的地址。其一般形式为:&变量名;如&a表示变量a的地址,&b表示变量b的地址。变量本身必须预先说明。
设有指向整型变量的指针变量p,如要把整型变量a 的地址赋予p可以有以下两种方式:
1、指针变量初始化的方法 inta; int*p=&a;
2、赋值语句的方法 inta; int*p; p=&a;
不允许把一个数赋予指针变量,故下面的赋值是错误的: int*p; p=1000;被赋值的指针变量前不能再加“*”说明符,如写为*p=&a 也是错误的。假设: inti=200, x; int*ip;我们定义了两个整型变量i,x,还定义了一个指向整型数的指针变量ip。i,x中可存放整数,而ip中只能存放整型变量的地址。我们可以把i的地址赋给ip:ip=&i;main(){ int a,b; int *pointer_1, *pointer_2; a=100;b=10; pointer_1=&a; pointer_2=&b; printf("%d,%dn",a,b); printf("%d,%dn",*pointer_1,*pointer_2);}
输入a和b两个整数,按先大后小的顺序输出a和b。main(){ int *p1,*p2,*p,a,b;scanf("%d,%d",&a,&b);p1=&a;p2=&b; if(a<b) {p=p1;p1=p2;p2=p;} printf("na=%d,b=%dn",a,b); printf("max=%d,min=%dn",*p1, *p2);}
函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。不能企图通过改变指针形参的值而使指针实参的值改变。swap(int *p1,int *p2){int *p;p=p1;p1=p2;p2=p;}输入a、b、c3个整数,按大小顺序输出swap(int *pt1,int *pt2){int temp;temp=*pt1;*pt1=*pt2;*pt2=temp;}exchange(int *q1,int *q2,int *q3){ if(*q1<*q2)swap(q1,q2);if(*q1<*q3)swap(q1,q3);if(*q2<*q3)swap(q2,q3);}main(){int a,b,c,*p1,*p2,*p3;scanf("%d,%d,%d",&a,&b,&c);p1=&a;p2=&b;p3=&c; exchange(p1,p2,p3); printf("n%d,%d,%d n",a,b,c);}
指针变量之间的运算两指针变量相减:两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。两个指针变量不能进行加法运算。例如,pf1+pf2是什么意思呢?毫无实际意义。两指针变量进行关系运算:指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系。例如:pf1==pf2表示pf1和pf2指向同一数组元素;pf1>pf2表示pf1处于高地址位置;pf1<pf2表示pf2处于低地址位置。
指针变量还可以与0比较。设p为指针变量,则p==0表明p是空指针,它不指向任何变量;p!=0表示p不是空指针。空指针是由对指针变量赋予0值而得到的。例如: #define NULL 0 int*p=NULL;对指针变量赋0值和不赋值是不同的。指针变量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。
定义一个指向数组元素的指针变量的方法int *p=a;p,a,&a[0]均指向同一单元,它们是数组a的首地址,也是0号元素a[0]的首地址。应该说明的是p是变量,而a,&a[0]都是常量。在编程时应予以注意。指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。几个注意的问题:指针变量可以实现本身的值的改变。如p++是合法的;而a++是错误的。因为a是数组名,它是数组的首地址,是常量。【例10.13】找出错误。main(){ int *p,i,a[10]; p=a;for(i=0;i<10;i++) *p++=i; for(i=0;i<10;i++) printf("a[%d]=%dn",i,*p++);}
【例10.14】改正。main(){ int *p,i,a[10]; p=a;for(i=0;i<10;i++)*p++=i; p=a; for(i=0;i<10;i++) printf("a[%d]=%dn",i,*p++);}多维数组中&a[i]和a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]的地址,不存在元素a[i]。C语言规定,它是一种地址计算方法,表示数组a第i行首地址。由此,我们得出:a[i],&a[i],*(a+i)和a+i也都是等同的
指向多维数组的指针变量把二维数组a分解为一维数组a[0],a[1],a[2]之后,设p为指向二维数组的指针变量。可定义为: int (*p)[4]它表示p是一个指针变量,它指向包含4个元素的一维数组。若指向第一个一维数组a[0],其值等于a,a[0],或&a[0][0]等。而p+i则指向一维数组a[i]。从前面的分析可得出*(p+i)+j是二维数组i行j列的元素的地址,而*(*(p+i)+j)则是i行j列元素的值。二维数组指针变量说明的一般形式为:类型说明符 (*指针变量名)[长度]
函数指针变量int max(int a,int b){
if(a>b)return a;
else return b;
}
main(){
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf("input two numbers:n");
scanf("%d%d",&x,&y);
z=(*pmax)(x,y);
printf("maxmum=%d",z);
}
使用函数指针变量还应注意以下两点:
  1. 函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。
  2. 函数调用中"(*指针变量名)"的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号

注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。如int(*p)()和int*p()是两个完全不同的量。
int(*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。
int*p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。
对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。

二维数组指针变量是单个的变量,其一般形式中"(*指针变量名)"两边的括号不可少。而指针数组类型表示的是多个指针(一组有序指针)在一般形式中"*指针数组名"两边不能有括号。例如: int (*p)[3];表示一个指向二维数组的指针变量。该二维数组的列数为3或分解为一维数组的长度为3。 int *p[3]表示p是一个指针数组,有三个下标变量p[0],p[1],p[2]均为指针变量。指针数组的元素只能存放地址。如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。在前面已经介绍过,通过指针访问变量称为间接访问。由于指针变量直接指向变量,所以称为“单级间址”。而如果通过指向指针的指针变量来访问变量则构成“二级间址”。char **p;main(){static int a[5]={1,3,5,7,9};int*num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};int **p,i;p=num;for(i=0;i<5;i++){printf("%dt",**p);p++;}}
实际上,main函数可以带参数,这个参数可以认为是main函数的形式参数。C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为: main (argc,argv)
C语言还规定argc(第一个形参)必须是整型变量,argv(第二个形参)必须是指向字符串的指针数组。加上形参说明后,main函数的函数头应写为: main (int argc,char*argv[])

void指针类型

ANSI新标准增加了一种“void”指针类型,即可以定义一个指针变量,但不指定它是指向哪一种类型数据。
定义含 义
int i;定义整型变量i
int *pp为指向整型数据的指针变量
int a[n];定义整型数组a,它有n个元素
int *p[n];定义指针数组p,它由n个指向整型数据的指针元素组成
int (*p)[n];p为指向含n个元素的一维数组的指针变量
int f();f为带回整型函数值的函数
int *p();p为带回一个指针的函数,该指针指向整型数据
int (*p)();p为指向函数的指针,该函数返回一个整型值
int **p;P是一个指针变量,它指向一个指向整型数据的指针变量

  

爱华网本文地址 » http://www.413yy.cn/a/25101013/182303.html

更多阅读

藕粉的作用与功效 藕粉会发胖吗

华夏璀璨,睿智之选;乐于奉献,王者风范!对,这就是作家俺一贯保持的作风。闲来无事给大家说说这个藕粉:藕粉是久负盛誉的传统滋养食品,而且营养价值高,药疗作用好。口感不错、鲜美独特,老少皆宜。藕粉的作用与功效——工具/原料想、必,得多百度

乌龙茶的功效 蜂蜜水的作用与功效

乌龙茶中含有大量的茶多酚,可以提高脂肪分解酶的作用,降低血液中的胆固醇含量,有降低血压、抗氧化、防衰老及防癌等作用。最近发表在《肥胖期刊》上的一项研究指出,经常喝乌龙茶的人,身体质量指数和脂肪含有率都比少喝的人低。而且,女人减

莲子的作用及食用方法 石榴的功效与作用

莲子性味甘平,每500克莲子中含有热量1500大卡左右,莲子的功效主要有:化痰止咳,降血压血脂,还可以壮阳,补脑安神之功效。莲子的作用及食用方法——莲子的功效性平、味甘涩,入心、脾、肾经;补脾止泻,益肾涩清,养心安神。用于脾虚久泻,遗精带下,心

酵素的作用与功效 酵素的副作用

酵素的作用与功效——简介 亚健康人凡有肩膀疼痛、四肢无力、疲倦、头晕眼花、食欲不振等都是“半(亚)健康症”,处在压力过大的现代人或多或少都有上述情况,半(亚)健康症状就是酵素作用“短路”,问题越严重,就越可能变成疾病。酵素能充分发

键盘空格键的作用有哪些? 键盘空格键失灵

键盘空格键的作用有哪些?——简介键盘空格键,顾名思义就是敲出空格的按键,那么,它除了能敲出空格外,键盘空格键的作用还有哪些?键盘空格键的作用有哪些?——工具/原料电脑键盘键盘空格键的作用有哪些?——方法/步骤键盘空格键的作用有哪些?

声明:《指针 指针的指针的作用》为网友深海里的那抹蓝分享!如侵犯到您的合法权益请联系我们删除