指针
指针
一、指针的概念和类型
(1)如果在程序中定义了一个变量,在对程序编译时,系统就会给这个变量分配内存单元。编译系统会根据程序中定义的变量类型,分配一定长度的空间。内存区的每一个字节有一个编号,这就是“地址”。“地址“相当于是旅馆中的房间号,在地址所标志的内存单元中存放的数据相当于房间中居住的旅客。在系统中通过地址能找到所需的变量单元,将”地址“形象化的称为“指针”。
(2)指针的类型有int、float、double…在定义指针变量时必须确定指针类型。int 变量的指针需要用 int 类型的指针存储,float 变量的指针需要用 float 类型的指针存储。
二、 指针变量
(1)定义指针变量
定义指针变量的一般形式: *类型名 指针变量名; 如:
int *a,*b;//int 型的指针变量
float *x;//float型的指针变量
char *y;//cahr型的指针变量
在上面的指针变量中“”表示该变量为指针变量。a,b是指针变量名,而不是a和*b。
(2)引用指针变量
引用时有三种情况:
1、给指针变量赋值;如:
p=&a;//把a的地址赋给指针变量p`
2、引用指针变量指向的变量;如:
p=&a;//把a的地址赋给指针变量p
printf("%d",*p);//以整数形式输出指针变量p所指向的变量的值,即变量a的值
3、引用指针变量的值;如:
p=&a;//把a的地址赋给指针变量p
printf("%o",p);//输出a的地址
指针变量应用的例子:
#include<stdio.h>
int main()
{
int *p1,*p2,*p,a,b; //int *类型的怕,篇
scanf("%d,%d",&a,&b);
p1=&a; //使p1指向变量a
p2=&b; //使p2指向变量b
if(a<b)
{
p=p1;
p1=p2; //p1,p2的值互换
p2=p;
}
printf("a=%d,b=%d\n",a,b);//输出a,b的值
printf("max=%d,min=%d\n",*p1,*p2);//输出p1,p2指向的变量的值
return 0;
}
输出结果:
(3) 指针变量作为函数参数
函数参数不仅可以是整形、浮点型、字符型等数据类型,还可以是指针类型。它的作用是讲一个变量的地址传送到另一个函数中。
如:
void swap(int *p1,int *p2)//定义swap函数
{
int temp;
temp=*p1; //不能写成*temp
*p1=*p2; //*p1,*p2为指针变量
*p2=temp;
}
三、通过指针引用数组
(1)数组元素的指针
指针变量既然可以指向变量,当然也可以指向数组元素。所谓数组元素就是数组元素的地址。
int *p; //定义p为指向整型变量的指针变量
int a[10]; //定义a为包含10个整形数据的数组
p=&a[0]; //p的值为a[0]的地址
p=a; //p的值是数组a首元素(即a[0])的地址
在C语言中,数组名代表数组的首个元素(即序号为0的元素)的地址。
(2)引用数组元素时指针的运算
在**指针已指向一个数组元素时,**可以对指针进行如下运算:
加一个整数(用+或+=),如p+1;指向同一数组中的下一个元素;
减一个整数(用-或-=),如p-1;指向同一数组中的上一个元素;
自加运算,如p++,++p;
自减运算,如p–,--p;
两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意义)
两个地址不能相加!
如果p的初值为&a[0],则p+i和a+i就是数组元素a[i]的地址。
(3)通过指针引用数组元素
引用数组元素有两种方法:
1、**下标法:**如a[i]的形式;
2、**指针法:**如 *(a+i)或 *(p+i)。其中a是数组名,p是指向数组变量的指针变量,其初值p=a。
int a[10];
int *p;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
printf("%d",*(a+i));//通过数组名和元素序号计算元素地址,再找到该元素
int a[10];
int *p;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(p=a;p<(a+10);p++)
printf("%d",*p);//用指针指向当前的数组元素
(4)用数组名作为函数参数
直接举一个例子:
void swap(int *x, int *y);
void main(){
int x = 20, y = 10;
swap(&x, &y);
printf("x = %d, y = %d", x ,y);
}
void swap(int *x, int *y){
int temp;
temp= *x;
*x = *y;
*y = temp;
}
这里传入的参数为指针,所以调用 swap 方法后 x,y 的内容发生了交换。如果直接传入 x,y,那么交换只在 swap 中有效,在 main 中并没有交换。
指针的内容不只这些,下节指针与多维数组,敬请期待!