指针
指针就是地址,指针也是C语言的一种数据类型,用指针类型定义的变量称为指针变量。指针变量与普通变量一样占有一定的存储空间中存放的不是普通数据,而是一个地址,一个变量的地址被称为该变量的指针。
指针变量的定义
指针变量同其他类型变量一样,也要先定义后使用。指针变量定义的一般形式为:
类型标识符 变量名;
(1) 变量名前的““号是指针类型的标志。定义时,在每个指针变量前都应有“*”号,以表示该变量为指针变量。
(2) 类型标识符是指针变量所指向的数据类型。指针变量的值仅指出指向对象存储空间的首地址,而该存储空间的大小,即存储什么类型的数据,则由指针变量的类型标识符决定。根据指针变量指向存储空间中存放的不同数据类型,将指针变量为整型指针变量,字符型指针变量等。
例: char *point_c
Int *point_i
其中point_c是指向字符型数据的指针变量,而point_i是指向整型数据的指针变量,因此,指针变量point_c指向一个字节的存储空间,而指针变量point_i指向两个字节的存储空间。
指针变量的使用
C语言指针变量的使用需要以下两个运算符
(1) &:取地址运算符,它返回运算对象的内存地址。
(2) :指针运算符,也称为“间接引用操作符“,它返回指针所指向变量的值,与&互补。
在程序中使用指针处理数据时,需要特别注意:指针变量在使用前必须被赋值确定的地址值,既可以用变量的地址对指针变量赋值,如“p1=&a;“,也可以用已经赋值的同类型指针变量对指针变量赋值,如”p=p1;“。一个没有赋初始值的指针变量是不确定的,可能指向内存中任何一个地方,如果使用该指针将产生不可预见的错误。
指针的算术运算
指针算术运算是以指针变量存储的地址值作为对象进行的运算,它与普通变量的运算在种类和意义上是不同的。由于指针是地址,指针算术运算只能进行加减。
指针算术运算与指针类型有密切关系。指针变量进行加减时,其值(地址值)变动的单位不是字节,而是指针变量指向的数据类型占用的内存单元数
Char p=1000
P+1 →1001
P+2→1002
Int p=2000
P+1=2002
P+2=2004
指针与数组
可以将一维数组的首地址或其元素的地址赋值给相同数据类型的指针变量 使该指针变量指向一维数组或其元素,进而利用该指针变量处理一维数组或其元素。
例如:
int a[10]
Int p;
P=&a[0];
将一维数组元素a[0]的地址赋给指针变量p,从而使p指向数组元素a[0]
(1) p+i就是数组元素a[i]的地址。这时由于指向数组的第一个元素,即a[0],根据指针运算规则,p+1即为a[1]的地址,p+i所指向的数组元素,即a[i].
(2) 指向数组的指针变量也可以带下标,即p[i]与(p+i)等价
综上所述,引用一维数组的元素,可以用以下两种方法。
(1) 下标法。如a[i],p[i];
(2) 指针法,如(a+i),(p+i)
指针与函数
指针作函数的参数
函数的参数不仅可以是整型,实型,字符型等基本类型的数据,还可以是指针类型数据。指针作参数的作用是将一个变量的地址传送到另一个函数中,这样,形参指针就指向主调函数中的变量,从而可以改变主调函数中变量的值。
由上例可见,使用指针作函数参数时,通过形参指针可以改变主调函数中变量的值,在函数调用结束后,这些被改变的变量值被保留下来,因此,可以用指针作函数参数的方式,从函数中得到多个返回值。
返回指针的函数
函数调用结束后,可以返回一个值给主调函数,这个值可以是整型,实型,字符型等基本类型数据,也可以是指针,即地址。
返回指针值函数的一般定义形式为
类型标识符 函数名(形参表)
例如
Int f(int a,int b)
{……}
其中,函数名f前面的表示此函数是指针型函数,即该函数的返回值是指针。前面的int表示返回指针是指向整型数据的指针。
例 编写str_chr函数,其功能是在一个字符串中查找一个指定字符,找到后返回该字符的地址,若未找到则返回空指针。在main函数中调用str_chr函数,查找字符‘e’在字符串“how are you!“中的地址以及相对位置并输出。
指向函数的指针
C语言的指针变量不仅可以指向变量,字符串和数组,也可以指向函数。程序执行时,函数代码被存放在用户程序区。编译系统在编译源程序时为每个函数分配一个入口地址,这个入口地址被称为函数的指针。因此,可以将函数的指针赋给一个指向函数的指针变量,然后通过该指针变量调用其指向的函数
说明:
(1) 指向函数的指针变量定义的一般形式为:
类型标识符 (指针变量名)( );
(2) 可以用函数名调用函数,也可以用指向函数的指针变量调用函数,两种方法作用相同。
(3) 指向函数的指向变量专门用来存放函数的入口地址,它并不固定指向某个函数,把哪个函数的地址付给它,它就指向哪个函数,一个指向函数的指针变量可以指向不同的函数。
(4) 对指向函数的指针变量赋值,只需给出函数名,不涉及实参与形参的结合问题。例如:f=add
(5) 用指向函数的指针变量调用函数时,只需用(f)代替函数名即可,在(f)之后的括号中根据要求写上实参,例如:z=(*f)(x,y);
(6) 对指向函数的指针变量进行加减运算没有意义,不能通过f++指向下一条指令或者下一个函数,如f++,f--,f+n等运算都无意义。
include<stdio.h>
int main()
{
int a,b;
int p_a,p_b;
a = 100;
b = 200;
p_a = &a;
p_b = &b;
printf("\n&a=%xh,&b=%xh\n",&a,&b);
printf("p_a=%xh,p_b=%xh\n",p_a,p_b);
printf("&p_a=%xh,&p_b=%xh\n",&p_a,&p_b);
printf("a=%d,b=%d\n",a,b);
printf("p_a=%d,p_b=%d\n",p_a,p_b);
return 0;
}
include<stdio.h>
void swap(int p1,int p2)
{
int temp;
temp = p1;
p1 = p2;
p2 = temp;
}
int main()
{
int a = 0,b = 0;
int point_a,point_b;
point_a = &a;
point_b = &b;
printf("请输入a和b:\n");
scanf("%d%d",&a,&b);
if(a > b)
swap(a,b);
printf("%d %d\n",a,b);
return 0;
}
include<stdio.h>
char str_chr(char str,char ch)
{
while((str!=ch)&&(str!=NULL))
str ++;
if(*str==NULL) return (0); //未找到,返回空指针
return(str);
}
int main()
{
char *p,ch,str[]="How are you!";
ch = 'e';
p = str_chr(str,ch);
if(p)
{
printf("string starts at %xh.\n",str);
printf("char'%c'at%xh.\n",ch,p);
printf("position %d.\n",p-str);
}
else
printf("not found!\n");
return 0;
}