指针变量的赋值
指针变量和普通变量一样,不仅要在使用前定义说明,而且要给出具体的值。 无法使用未分配的指针变量。 如果不使用,系统会混乱或死机。 指针变量的代入只能赋予地址,不能赋予其他数据。 否则,会发生错误。 在C语言中,变量的地址由编译系统分配,对用户完全透明,用户不知道变量的具体地址。 c语言提供了表示变量地址的地址运算符。 其一般形式为变量名; a表示变量a的地址,b表示变量b的地址。 变量本身必须事先说明。 存在指向整数变量的指针变量p。 将整数变量a的地址赋予p有以下两种方法。
(1)指针变量的初始化方法int a;
int *p=a;
)2)赋值语句的方法int a;
int *p;
p=a;
以下赋值是错误的,因为不允许为指针变量提供一个数。 int *p; p=1000; 不能在赋值的指针变量之前加上“*”说明符。 *写*p=a也是错误的。
指针变量的运算
指针变量可以进行某些运算,但其运算类型有限。 只能进行代入运算、部分算术运算和关系运算。
指针运算符
1 .取地址运算符取地址运算符是单眼运算符,耦合性是从右到左,其功能是取变量的地址。
2 .取内容运算符*取内容运算符*是单眼运算符,结合性从右到左,表示指针变量所指的变量。 *运算符后的变量必须是指针变量。 请注意,指针运算符*和指针变量说明中的指针描述符*不同。 在指针变量的说明中,“*”是类型说明符,表示后面的变量是指针类型。 表达式中的“*”是表示指针变量所指变量的运算符。
主()。
int a=5,*p=a;
printf('%d ',*p );
}
.//指示指针变量p已获取整数变量a的地址。 此语句表示输出变量a的值。
赋值运算
指针变量的赋值运算有以下形式。
1 :指针变量的初始化赋值。
2 )对指向同一数据类型的指针变量赋予1个变量的地址。 例如:
int a,*pa;
pa=a; /*整数类型指针变量pa*/
3、向指向同一类型变量的另一个指针变量赋予一个指针变量的值。 例如:
int a,*pa=a,*pb;
pb=pa; /*指针变量pb*/
pa、pb都是整数变量的指针变量,因此可以相互赋值。
4、将数组的起始地址赋予数组的指针变量。
例如int a[5]、*pa;
pa=a; (数组名表示数组的开头地址,所以可以给出数组的指针变量pa )
也可以写如下
pa=a[0]; /*数组中第一个元素的地址也是整个数组的第一个地址。
pa*/
当然,也有初始化赋值的方法。
int a[5],*pa=a;
5 .将字符串的起始地址赋予字符类型的指针变量。 例如,char *pc; 电脑=' c语言'; 或初始化赋值的方法,使用char *pc='C Language '; 应该说明的是,不是将整个字符串放入指针变量中,而是将存储字符串的字符数组的起始地址放入指针变量中。 稍后详细介绍。
6 .为函数的指针变量提供函数的入口地址。 例如int(*pf ) ); pf=f; /*f是函数名*/
加减法
指向数组的指针变量可以加上或减去整数n。 如果将pa作为数组a的指针变量,则pa n、pa-n、pa、pa、pa----pa运算都是合法的。 在指针变量中添加或减去整数n的含义是将指针指向的当前位置(指向数组元素)向前或向后移动n个位置。 请注意,向前或向后移动一个数组指针变量与向地址加或减1在概念上是不同的。 因为数组有不同的类型,每个类型的数组元素所占的字节长度不同。 将指针变量加1会将指针变量指向下一个数据元素的起始地址的位置向后移动一个位置。 不是在原来的地址上加1。
例如:
int a[5],*pa;
pa=a; /*pa指数组a,a[0]*/
pa=pa 2; /*pa指的是a[2]。 也就是说,pa的值为pa[2]*/
指针变量的加减运算只能对数组指针变量进行,对其他类型变量的指针变量的加减运算是无意义的。 )3)两个指针变量之间的运算只能在指向同一数组的两个指针变量之间进行。 否则,运算就没有意义。
两指针变量的减法
减去两个指针变量后的差是两个指针所具有的指数组元素之间的差的元素数。 实际上,是两个指针值(地址)的减法差除以数组元素的长度(字节数)。 例如,pf1和pf2是指向同一个浮点数组的两个指针变量,pf1的值为2010H,pf2的值为2000H,浮点数组的每个元素都占4
个字节,所以pf1-pf2的结果为(2000H-2010H)/4=4,表示pf1和 pf2之间相差4个元素。两个指针变量不能进行加法运算。 例如, pf1+pf2是什么意思呢?毫无实际意义。②两指针变量进行关系运算
指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系。例如:
pf1==pf2表示pf1和pf2指向同一数组元素
pf1>pf2表示pf1处于高地址位置
pf1
main(){
int a=10,b=20,s,t,*pa,*pb;
pa=&a;
pb=&b;
s=*pa+*pb;
t=*pa**pb;
printf("a=%dnb=%dna+b=%dna*b=%dn",a,b,a+b,a*b);
printf("s=%dnt=%dn",s,t);
}
...... 说明pa,pb为整型指针变量
给指针变量pa赋值,pa指向变量a。
给指针变量pb赋值,pb指向变量b。
本行的意义是求a+b之和,(*pa就是a,*pb就是b)。
本行是求a*b之积。
输出结果。
输出结果。
......
指针变量还可以与0比较。设p为指针变量,则p==0表明p是空指针,它不指向任何变量;p!=0表示p不是空指针。空指针是由对指针变量赋予0值而得到的。例如: #define NULL 0 int *p=NULL; 对指针变量赋0值和不赋值是不同的。指针变量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。
main(){
int a,b,c,*pmax,*pmin;
printf("input three numbers:n");
scanf("%d%d%d",&a,&b,&c);
if(a>b){
pmax=&a;
pmin=&b;}
else{
pmax=&b;
pmin=&a;}
if(c>*pmax) pmax=&c;
if(c
printf("max=%dnmin=%dn",*pmax,*pmin);
}
上面代码的意思是:
pmax,pmin为整型指针变量。
输入提示。
输入三个数字。
如果第一个数字大于第二个数字...
指针变量赋值
指针变量赋值
指针变量赋值
指针变量赋值
判断并赋值
判断并赋值
输出结果
......