当前位置:文档之家› C语言 地址和指针的概念 指针

C语言 地址和指针的概念 指针


例T10-3-3.c 形参、实参都是指针变量时,虽在被调函数中改
变了指针的值,但当返回主函数时,分配单元被释放,主调函
数中的实参指针仍指向原来变量。 结论:形参与实参之间的数据传递(指针或普通变量)
是单向的值传递,实参中指针的值并没有改变,变量
swap(int *p1, int *p2)
a,b的值也没改变。
例T10-2.c 输入a,b,用指针方法按先大后小的顺序输出。
main( ) {int *p1, *p2, *p, a, b;
换前 换后
scanf(“%d%d”,&a,&b); p1=&a;p2=&b; printf(“a=%d, b=%d\ n”, a, b);
ffd0 ffd6 ffd8 p1 ffd2 ffd8 ffd6 p2
变量所对应的内存地址。
10.2 变量的指针和指向变量的指针变量 变量的指针:就是变量的地址。 如 i 所对应的内存地址是2000,则 i 的指针就是
2000 指针变量:用来存放变量地址的变量, 如:ip所对应的地址是3010,其内容是2000, 2000
就是 i 所对应的地址(指针),因此,ip是存放变量 i 的地址的变量。
ffca 5 p
printf(“&p=%x,&p1=%x,&p2= %x\ n”,&p, &p1, p2); printf(“p=%d,*p1=%d,*p2=%d\ n”,
┇ ffd0 ffd4 ffd2 ffd6 ffd4 5 ffd6 9
1.直接访问
i
k
j
2004 2005 =9
k 2.间接访问
=
i+
j
2000
2002
2001=3 2003=6
* kp
ip 3014
= * ip 3010
+ *jp 3012
jp 3015 2004
3011 2000 3013 2002
kp
2005=9
2001=3
2003=6
这里:i p, j p, k p:就称为指针变量,其值是另一个
若ip 是存放变量i 的地址的指针变量,即ip=&i; 则 *ip是指针变量 ip所指的对象(即变量 i )
i=3

等价
*ip=3
ip 2000
3i 2000
10.2.1 定义一个指针变量
指针变量在使用前必须定义,以便使其指向特定类型的变量 例:
int i, j; int *p1, *p2; p1=&i; p2=&j ; i=3; *p1=5; j=6; *p2=8;
ffc8 5
t
ffce 5 9 x
ffd0 9 5 y
ffd2 5
a
ffd4 9
b
main( )
在被调用函数中变量
{int a, b; scanf(“%d%d”,&a, &b);
的值被交换了,返回主
if(a<b) swap(a, b); printf(“&a=%x, &b=%x\ n”, &a, &b);
问题:函数调用结束后, 分配给p1,p2单元释放否?
ffca 5 p ┇
ffd0 ffd4 p1 ffd2 ffd6 p2 ffd4 5 9 a ffd6 9 5 b ffd8 ffd4 p11 ffda ffd6 p12
运行:输入:5,9 输出:&a=ffd4,&b=ffd6, &p11=ffd8,&p12=ffda
main( ) {int a, b, *p11, *p12; scanf(“%d%d”,&a, &b); p11=&a; p12=&b; if(a<b) swap(p11, p12); printf(“&a=%x, &b=%x, &p11=%x, &p12=%x\ n”, &a, &a, &p11, &p12);
关于 & 和 * 运算符的进一步说明: * 、&:优先级同为2级, 结合性:从右向左。
1.若已执行: int a, b, * p1, * p2; p1=&a; p2=&b; a=100; b=10;
则 ① &* p1 &a (p1) &* p2 &b (p2)
②p2=&* p1 p2=&a
p1
p1 p2 a9 b5
p, *p1, *p2);
ffd8 ffd4 p11
}
ffda ffd6 p12
main( ) {int a, b, *p11, *p12; scanf(“%d%d”, &a, &b); p11=&a; p12=&b; printf(“&a=%x,&b=%x,&p11=%x, &p12=%x\ n”,&a, &b, &p11&p12); printf(“p11=%x,p12=%x\ n”,p11, p12); printf(“a=%d,b=%d\ n”,a,b); if(a<b) swap(p11,p12); printf(“max=%d,min=%d\ n”,a,b);}
printf(“p1=%x, p2=%x, p=%x\ n”, p1, p2, p);
printf(“max=%d, min=%d\ n”, * p1, *p2);
}
输入: 5
9
输出:
a=5,b=9
*p1=5,*p2=9
&a=ffd6, &b=ffd8
p1=ffd6, p2=ffd8, p2=20
运行:5, 9 输出:p=ffd2, p11=ffd2, p2=ffd4
a=9, b=9
{int a, b; int * p11, * p12;
scanf(“%d%d”, &a, &b);
p11=&a; p12=&b; if(a<b) swap(p11, p12); printf(“a=%d, b=%d\ n”,a,b);
&p1=ffd0,&p2=ffd2,&p=ffd4
a=5, b=9
*p1=9,*p2=5
&a=ffd6,&b=ffd8
p1=ffd8, p2=ffd6, p=ffd6
&p1=ffd0,&p2=ffd2,&p=ffd4
max=9, min=5
换前 换后
ffd0 ffd6
ffpd18
ffd2 ffd8
ffpd26
函数后,变量的值为什 么依旧? 原因:单向的 值传递,当函数调用返
printf(“a=%d, b=%d\ n”, a, b);
回后,分配的单元被释
}
放了.
输入: 5, 9
输出: &t=ffc8, &x=ffce, &y=ffd0
t=5, x=9, y=5 &a=ffd2, &b=ffd4
a=5,b=9
printf(“*p1=%d,*p2=%d\n”, *p1,*p2); printf(“&a=%x, &b=%x\ n”,
ffd4 20 ffd6 p
ffd6 5
5
a
&a, &b); printf(“p1=%x, p2=%x, p=%x\ n”,
ffd8 9
9
b
p1, p2, p);
只交换了指针的值,没有
ffd4 20
ffpd6
ffd6 5
a5
ffd8 9
b9
只交换了指针的值,没有交 换变量的值
10.2.3 指针变量作为函数参数
指针变量作为函数参数时,传递的是变量的地址。
例T10-3.c 指针变量作函数参数,将两个整数按大小顺序输
出。
swap(int *p1, int *p2)
{int p; p=*p1; *p1=*p2; *p2=p;
}
ffd2 p1 p ffd4 p2 ffd2 5 9 a ffd4 9 9 b ffd2 p11 ffd4 p12
如何解决此问题?
例T10-3-2.c 在数据交换过程中,形实参采用普通变量
swap(int x, int y) {int t; t=x; x=y; y=t; printf(“&t=%x, &x=%x, &y=%x\ n”, &t, &x, &y); printf(“t=%d, x=%d, y=%d\ n”, t, x, y); }
说明: 1、定义时指针变量名前以 ‘ * ’ 开头。 2、指针变量一经定义就只可指向同类型的变
量。 如:float *p3;
指针变量名是p3,它只能指向实型数据。 3、在引用中,指针变量前加 ‘ * ’ 表示 指针变量所指向的 对象(即变量)。
10.2.2 指针变量的引用 通常,只能将变量的地址赋给指针变量,但
若在被调函数中通过指针变量改变所指对象的值,结果
{int *p; p=p1; p1=p2; p2=p;
如何?
printf(“&p=%x, &p1=%x, &p2=%x\ n”, &p, &p1, &p2);
printf(“p=%x, p1=%x, p2=%x\ n”, p, p1, p2);
printf(“*p=%d, *p1=%d, *p2=%d\ n”, *p, *p1, *p2); }
相关主题