文档介绍:内容
变量的指针
1
指针变量
2
指针变量作为函数参数
3
变量的指针
指针是C语言的重要特色之一,利用它可以写出高效率的程序。
内存可以看成是由许多字节顺序排列而成,而且每个字节都有唯一的内存地址,就象宾馆里的客房都有唯一的房号一样。
另外,对于程序中每个变量,C系统会根据变量的类型,在内存中分配相应大小的存储单元,用于存放变量的值。
int i=5;
float f=;
char c=’A’;
……
i
f
c
5
A
我们把变量所对应的存储单元的首字节的地址称为变量的地址,可用取地址运算符&来获取变量的地址。
由于变量的地址指明了变量的存储位置,所以被说成是“指向”变量,并形象地称为变量的指针。
内容
指针变量
2
变量的指针
1
指针变量作为函数参数
3
指针变量
在C语言中,可以定义变量来存放变量的地址/指针,这种用来存放变量地址的变量称为指针变量。指针变量可按如下形式定义:
基类型*指针变量名1,*指针变量名2,…, *指针变量名m ;
与其他变量一样,对于每个指针变量,C系统会为它在内存中分配存储单元。
int *p1;
float *p2;
char *p3;
p1
p2
p3
值得注意的是,C系统为所有指针变量分配同样大小的存储单元。例如,TC为上面的3个指针变量都分配2字节的存储单元。
因此,为指针变量分配的存储单元的大小与基类型无关。
既然如此,那为什么在定义指针变量时还要指定基类型呢?
地址运算符&和指针运算符*
⑴取地址运算符&的一般形式为:
&变量
它用来获得变量的地址,该地址可以存放到同类型的指针变量里。
⑵指针运算符*的一般形式为:
*指针表达式
由于指针表达式的值仍为指针,它用来表示该指针所指向的变量。
void main()
{
int m=3, n=5;
int *p1,*p2;
p1=&m;
p2=&n;
printf(”%d,%d”,m,n);
printf(”%d,%d”,*p1,*p2);
}
①p1=&m (√) ②n=&m (×)
①*p1 (√) ②*n (×) ③*p1=&m (×)
⑶& 与* 的优先级相同,结合方向是自右向左。
①*&m (√)
②&*m (×)
3
变量m
2000
p1
*p1
m
*p1
&m
p1
m=3
*p1=3
内容
指针变量作为函数参数
3
变量的指针
1
指针变量
2
?
#include <>
void swap(int x,int y)
{
int t;
t=x;
x=y;
y=t;
}
void main()
{
int a=3,b=5;
swap(a,b);
printf("\n%d,%d",a,b);
}
练习编写交换两个变量的函数swap
指针变量作为函数参数
#include <>
void f1(int k,int *p)
{ *p=k+(*p);
k=10;
p=&k;
}
void main()
{ int a=3,b=5;
int *ptr;
ptr=&a;
f1(b, ptr);
printf(“%d,%d”,a,b);
}
指针变量作形参
指针变量作实参
①在主调函数中定义指针变量(ptr),并使其指向要修改的变量(a)。
②将指针变量(ptr)作为实参,把变量(a)的地址传递给被调函数(f1)的形参。
③通过形参指针变量(p)改变变量(a)的值。
④主调函数中可以使用改变了值的变量(a)。
练习、在被调函数B中修改主调函数A的变量a、b。
void B(int *p1,int *p2)
{ *p1=50;
*p2=100;
……
}
void A(…)
{ int a=3,b=5;
int *p1,*p2;
p1=&a;
p2=&b;
B(p1, p2);
/*a、b的值已变*/
……
}
也可改为:
B(&a, &b);
指针变量作为函数参数举例
#include <>
void swap(int x,int y)
{
int t;
t=x;
x=y;
y=t;
}
void main()
{
int a=3,b=5;
swap(a,b);
printf("\n%d,%d",a,b);
}
练习编写交换两个变量的函数swap。
#include <>
void swap(int *p1,int *p2)
{
int t;
t=*p1;
*p1=*p2;
*p2=t;
}
void main()