指针变量的引用 请牢记,指针变量中存放的一定是地址。不要将一个整型量或任 何其他非地址类型的数据)赋给一个指针变量。 如下面的赋值是不合法的: int *p; int k; p=k矧 有两个有关的运算符: 1)&:取地址运算符。 2)*:指针运算符或称“间接访问”运算符。 例如:&a为变量a的地址,*p为指针变量p所指向的存储单元。 例10.1通过指针变量访问整形变量。 程序代码见源代码10-1
指针变量的引用 请牢记,指针变量中存放的一定是地址。不要将一个整型量(或任 何其他非地址类型的数据)赋给一个指针变量。 如下面的赋值是不合法的: int *p; int k; p = k; 有两个有关的运算符: 1)&: 取地址运算符。 2) *: 指针运算符(或称“间接访问”运算符)。 例如:&a为变量a的地址,*p为指针变量p所指向的存储单元。 例10.1 通过指针变量访问整形变量。 程序代码见源代码10-1
“&”和“*”运算符说明 (1/3) 1)如果已执行了“pointer-.1=&a;”语句,若有 “&*pointer-1”它的含义是什么? “&”和“*”两个运算符的优先级别相同,但按自右而左方向结 合,因此先进行*pointer-l的运算,它就是变量a,再执行&运算。 因此,&*pointer-1与&a相同,即变量a的地址。如: pointer_2=&*pointer_1; 则, pointer_2与Pointer_1一样,都指向a的地址。如果Pointer-2原 来指向b,经过重新赋值后它己不再指向B了,而也指向了a。如 下图所示 pointer_l pointer_1 a &.a &.a pointer_2 6 pointer_2 &b &.a (a) (b
“&”和“*”运算符说明(1/3) 1)如果已执行了“pointer-1=&a;”语句,若有 “&*pointer-1”它的含义是什么? “&”和“*”两个运算符的优先级别相同,但按自右而左方向结 合,因此先进行*pointer-1的运算,它就是变量a,再执行&运算。 因此,&*pointer-1与&a相同,即变量a的地址。如: pointer_2 = &*pointer_1; 则,pointer_2与pointer_1一样,都指向a的地址。如果pointer-2原 来指向b,经过重新赋值后它已不再指向B了,而也指向了a。如 下图所示:
“&”和“*”运算符说明(2/3) 2)*&a的含义是什么? 先进行&a运算,得a的地址,再进行*运算。即&a 所指向的变量,*&a和*pointer-l的作用是一样的 (假设已执行了“pointer-I=&a,它们等价于变量 a。即*&a与a等价,如图所示: pointer_1 *pointer_1 &.a 火&a
“&”和“*”运算符说明(2/3) 2)*&a的含义是什么? 先进行&a运算,得a的地址,再进行*运算。即&a 所指向的变量,*&a和*pointer-1的作用是一样的 (假设已执行了“pointer-1=&a”),它们等价于变量 a。即*&a与a等价,如图所示:
“&”和“*”运算符说明(3/3) 3)(pointer-1)++相当于a++。注意括号是必要的, 如果没有括号,就成为了*pointer-1++,和*为同 一 优先级别,而结合方向为自右而左,因此它相 当于*(pointer-1++)。由于+在pointer-1的右侧, 是“后加”,因此先对pointer-l的原值进行*运算, 得到a的值,然后使pointer-1的值改变,这样 pointer-1不再指向a了
“&”和“*”运算符说明(3/3) 3)(*pointer-1)++相当于a++。注意括号是必要的, 如果没有括号,就成为了*pointer-1++,和*为同 一优先级别,而结合方向为自右而左,因此它相 当于*(pointer-1++)。由于++在pointer-1的右侧, 是“后加”,因此先对pointer-1的原值进行*运算, 得到a的值,然后使pointer-1的值改变,这样 pointer-1不再指向a了
示例 例10.2输入a和b两个整数,按先大后小的顺序输出a和b。 程序代码见源码10-2.c 分析如下图所示: pl &.a &b p2 6 p2 &.b &.a (a) (b)
示例 例10.2 输入a和b两个整数,按先大后小的顺序输出a和b。 程序代码见源码10-2.c 分析如下图所示: