例如 val=*px;等价 vfX g 先取出px中存储的地址值2000,再从地址200 开始的存储区中取出1085,把1085存入变量va的存 们表示把123 存入Dx指向左值表达式,既可出 表示取出px指 的地址的存也可出现在赋值 向的地址中存 储的内容,存 储空间中去。式的运算。例入变量vl。 px=123; val=*px
21 例如: 先取出px中存储的地址值 2000 , 再从地址2000 开始的存储区中取出 1085 , 把 1085 存入变量val的存 储区中。 val=*px ; val=x ; 等价 *p 是一个左值表达式, 既可出现在赋值运算符 的左边向它赋值,也可出现在赋值运算符的右边作 为运算分量参与表达式的运算。例如: *px=123; val = *px ; 表示把 123 存入px 指向 的地址的存 储空间中去。 表示取出px指 向的地址中存 储的内容,存 入变量 val
假定有inta[10,i,j,*ip=&i,*jp=&j;声明,则 ip=1;等价i=1; JP-=Ip; 等价j &=1;等价i1 jp)+;等价j+; *a=1;等价a0|=1; printf(“%d”,“ip+jp) 等价 printf(“%d”,计j); 22
22 假定有 int a[10] , i , j , *ip=&i , *jp=&j; 声明,则: *ip=1; 等价 i=1; *jp=*ip; 等价 j=i; *&i=1; 等价 i=1; (*jp)++; 等价 j++; *a=1; 等价 a[0]=1; printf (“%d”, *ip+*jp ) ; 等价 printf ( “%d” , i+j );
从理论上讲指针变量可以用来存放任何内存地址。 c飞会如只船指针变量指向一种特定类型的对 按定义 指向 型对象 里却把一个 ′问题,请看下执行n2=*x 点变量的地main 不能实现n2=f1l; 的目的。因为 址赋给了xp int *xp i float fl=l 12 &fl xxB printf(“%fn”,n2) 程序输出:-13107.0000 23
23 为了说明这个问题,请看下面的例子: main ( ) { int *xp ; float f1=15.3 , f2 ; xp=&f1 ; f2=*xp ; printf ( “%f\n” , f2 ) ; } 从理论上讲指针变量可以用来存放任何内存地址。 那么, 为什么要规定指针变量指向一种特定类型的对 象呢? 程序输出: -13107.000000 按定义,xp只能 指向 int 型对象, 但这里却把一个 浮点变量f1的地 址赋给了xp 执行 f2 = *xp; 不能实现 f2=f1; 的目的。因为
指针变量xp用于指向in型对象,只作用于两个 字节。而foat型对象占用连续四个字节,程序中虽 然将一个浮点变量的地址赋给了xp,但这并不意味 着将xp的基类型改变为ioa型而作用于连续四个字 节,xp仍然作用于两个字节。因此执行n2=xp 只是将fl这个浮点数的前两个字节的内容作为int 型数据解释并送给12,显然这已不是原来整个1的内 容了。 从这个例子可以看出,在使用指针变量时必须保 证其基类型与指向对象的数据类型相一致。 24
24 指针变量xp用于指向int型对象, 只作用于两个 字节。而float 型对象占用连续四个字节,程序中虽 然将一个浮点变量的地址赋给了 xp , 但这并不意味 着将xp的基类型改变为 float型而作用于连续四个字 节,xp 仍然作用于两个字节。 因此执行 f2=*xp ; 只是将 f1 这个浮点数的前两个字节的内容作为int 型数据解释并送给f2, 显然这已不是原来整个f1的内 容了。 从这个例子可以看出, 在使用指针变量时必须保 证其基类型与指向对象的数据类型相一致
void型指针无基类型,它所指向对象的类型还没 有确定,所以不可以对它使用“*"运算操作;同样,不 可以直接将变量赋给由void型指针所指向的对象。 例如 main( 应写成: void *p; 应写成: ip=(int)p;如a=10,ip; *(int*)p=123 p-p 次p=123
25 main ( ) { void *p ; int a=10 ,*ip ; p=&a ; ip=p ; *p=123 ; …… } void型指针无基类型,它所指向对象的类型还没 有确定, 所以不可以对它使用“*”运算操作; 同样, 不 可以直接将变量赋给由void型指针所指向的对象。 例如: 应写成: ip=(int*)p; 应写成: *(int*)p=123