C程序第8章Word文档格式.docx
《C程序第8章Word文档格式.docx》由会员分享,可在线阅读,更多相关《C程序第8章Word文档格式.docx(4页珍藏版)》请在冰豆网上搜索。
总结:
变量的地址是指该变量所占存储单元的第一个字节的地址。
也就是整个房子的地址是第一个房间的房间号。
所以变量a的地址为001。
2、指针变量
int*p;
floatc;
⑴指针变量的房子也是4个字节大小,房子里住的不是实际的数据,而是地址。
不是所有的地址都可以住进去,只有同类型的简单变量的地址,才可以放到同类型的指针变量里。
⑵指针变量p中可以存放变量a的地址值,但是不可以存放变量c的地址值,因为只有同类型的简单变量的地址,才可以放到同类型的指针变量里。
⑶如何定义指针变量?
一般形式:
类型名*指针变量名
int*pi,*pj;
double*pd;
①指针变量定义中的*号必不可少。
②int*pi,*pj;
中的int是指针变量pi和pj的基类型,它决定了只有int类型的简单变量的地址值才能放到指针变量pi和pj中。
3、二级指针、一级指针和简单变量的关系
int**p,*s,k=20;
s=&
k;
p=&
s;
⑴用两个*号定义的变量叫二级指针变量,用一个*号定义的变量叫一级指针变量。
⑵二级指针变量里存放同类型的一级指针变量的地址,一级指针变量里存放同类型的简单变量的地址。
⑶&
是求地址运算符,它是单目运算符,操作数出现在&
的右边。
如:
s=&
功能是求出简单变量k的地址,并且把k的地址放到指针变量s的房子里。
4、指针移动和基类型的关系
int*p,a,b;
p=&
a;
a
b
P→
请问p+1后,指针p是指向了变量a的第二个字节,还是指向了变量b的第一个字节?
答案是指向了变量b的第一个字节。
p+1不是指针移动一个字节,而是移动一个存储单元,一个存储单元多大,取决于指针变量在定义时所用的关键字,如本题中的int*p,因为指针变量p是用int定义的,所以一个存储单元的长度就是4个字节大小,故p+1才会指向变量b的第一个字节。
如果这样定义:
double*p;
那么p+1后,指针变量p移动几个字节?
5、给指针变量赋值(3个方法)
⑴通过求地址运算符(&
)赋值
intk=1,*p;
⑵通过指针变量赋值
intk=1,*p,*q;
q=p;
程序段的功能是:
把k的地址赋给指针变量p,然后再通过指针变量p把k的地址赋给指针变量q,最终结果是让p和q都指向了变量k。
⑶通过标准函数赋值(详见13章)
6、&
和*的区别
⑴&
:
求地址运算符,后跟一个变量,功能是求出改变量的地址值。
&
a,但是&
后不能跟表达式和常量,如:
2、&
(k+1)都是不合法的,也就是说,&
后只能跟一个变量。
⑵*:
间址运算符,后跟一个指针变量,目的是引用该指针所指向的房子。
int*p,i=10,j;
i;
j=*p;
j=*(&
i);
分析:
1j=*p;
等价于j=i;
2j=*(&
等价于j=i;
因为&
和*是互逆操作,同时出现相互抵消。
3切记:
后只能跟简单变量名,而*后只能跟指针变量名。
例8.1
用指针指向两个变量,通过指针运算选出值小的那个数。
#include<
stdio.h>
main()
{inta,b,min,*pa,*pb,*pmin;
pa=&
pb=&
b;
pmin=&
min;
scanf(“%d%d”,pa,pb);
printf(“a=%db=%d\n”,a,b);
*pmin=*pa;
if(*pa>
*pb)
*pmin=*pb;
printf(“min=%d\n”,min);
}
解析:
⑴pa=&
功能是把变量a的地址放到指针变量pa中,也就是让指针pa指向了变量a。
⑵*pmin=*pa;
等价于min=a;
*pa>
*pb等价于a>
b,*pmin=*pb;
等价于min=b。