名著阅读 > C语言解惑 > 2.9 输出值的操作符 >

2.9 输出值的操作符

在例2.11中,既然&a[i]表示数组a的各个元素的地址,这些地址存储相应数组元素的值,就应该能直接将这些值输出。

【例2.13】使用“*”操作符输出数组内容。


#include <stdio.h>
void main 
( 
)
{   
     int a[3]={1
,2
,3}
;
     int i=0
;
     //
输出数组地址
     for
(i=0
;i<3
;i++
)
         printf
("0x%p "
,&a[i]
);
     printf
("\n"
);
     //
输出数组内容
     for
(i=0
;i<3
;i++
)
         printf
("%d "
,*&a[i]
);
     printf
("\n"
);
}
  

地址用十六进制输出,地址里的内容采用在地址前加“*”号的方法输出。输出结果如下。


0x0012FF74  0x0012FF78  0x0012FF7C
1 2 3
  

上面演示了对数组的地址使用“*”操作的方法。如果用变量存储一个有效的地址,例如整型变量addr存储整型变量a的地址,能用“*addr”输出变量a的值吗?下面就通过程序来看看是否可行。

【例2.14】分析程序中存在的错误。


#include <stdio.h>
int main
()
{
     int a=25
;
     int addr
;
     addr=&a
;
     printf
("
分配给变量a
的地址0x%d\n"
,&a
);
     printf
("addr
的地址值=0x%p\n"
,addr
);          //
输出addr
的值
     printf
("addr
地址里的内容=%d\n"
,*addr
);     //
输出addr
的内容
     return 0
;
}
  

编译给出一个错误信息和一个警告信息。


warning C4047
: '=' 
: 'int ' differs in levels of indirection from 'int *'
error C2100
: illegal indirection
  

因为addr是整型变量,&a是地址值,所以造成语句“=”两边的数据类型不匹配。可以对地址值使用int进行强制转换以解决不匹配问题,即使用语句


addr=
(int
)&a
;
  

将地址转换成整型数值,完成“=”两边的匹配,这样就解决了编译时的警告信息。

直接对&a使用“*”,输出正确。但对addr出错,显然也是表达方式不匹配。使用强制转换,改用


printf
("addr
地址里的内容=%d\n"
,(int*
)addr
);
  

编译正确,输出结果如下。


分配给变量a
的地址0x1245052
addr
的地址值=0x0012FF7C
addr
地址里的内容=1245052
  

虽然输出结果不对,但有了解决办法。“1245052”就是addr的十进制地址,所以对这个地址使用“*”操作符即可。

因为语句“addr=(int)&a;”将地址强制转换成int类型值的地址,所以不能直接使用“*addr”,需要使用“(int*)addr”再将其转换成存储的地址值。程序的输出结果也证实了它就是变量a的地址,也就是存储在addr变量里的地址。这时再对它使用“*(int*)addr”,就能输出存储在addr地址里的值了。


//
改正后的正确程序
#include <stdio.h>
int main
()
{
     int a=25
;
     int addr
;
     addr=
(int
)&a
;
     printf
("
分配给变量a
的地址0x%d\n"
,&a
);
     printf
("addr
的地址值=0x%p\n"
,addr
);               //
输出addr
的值
     printf
("addr
地址里的内容=%d\n"
,*&a
);               //
输出addr
的值
     printf
("addr
地址里的内容=%d\n"
,*
(int*
)addr
);          //
输出addr
的内容
     return 0
;
}
  

输出结果如下。


分配给变量a
的地址0x1245052
addr
的地址值=0x0012FF7C
addr
地址里的内容=25
addr
地址里的内容=25
  

显然,把变量a的地址直接赋给变量addr,效果是一样的。

【例2.15】直接将地址赋给变量的例子。


#include <stdio.h>
int main
()
{
     int a=25
;
     int addr
;
     addr=
(int
)0x0012FF7C
;
     printf
("
分配给变量a
的地址0x%d\n"
,&a
);
     printf
("addr
的地址值=0x%p\n"
,addr
);               //
输出addr
的值
     printf
("addr
地址里的内容=%d\n"
,*&a
);               //
输出addr
的值
     printf
("addr
地址里的内容=%d\n"
,*
(int*
)addr
);          //
输出addr
的内容
     return 0
;
}
  

运行结果相同,不再给出。