当一个字符串常量出现在表达式中,它的值是个指针常量。编译器把这些指定
字符的一份拷贝存储于内存的某个位置,并存储一个指向第一个字符的指针。但
是,当数组名用于表达式中时,它们的值也是指针常量。我们可以对它们进行下
标引用、间接访问、指针运算。让我们来看一例:
"xyz"+1;
对于绝大多数程序员而言,它看上去象垃圾。它好象试图在一个字符串上面执
行某种类型的加法运算。但是当你记得字符串常量实际上是个指针时,它的意义
就变得清楚了。这个表达式计算“指针值加上1”的值。它的结果是个指针,指向
字符串中的第二个字符:y。
那么我们再来看一例:
"xyz"[2];
现在你应该能够推断出这个表达式的值就是字符z。
先来看一神秘函数:(参数是一个0~100之间的值)
#include<stdio.h>
void mystery(int n)
{
n+=5;
n/=10;
printf("%s\n","**********"+10-n);
}
它根据参数值的一定比例打印相应数量的星号。它比传统的循环方案要容易
的多,效率也高得多。
再来看一个例子:
/*
**接受一个无符号整型值,把它转换为字符,并打印出来,前导零被去除
*/
#include<stdio.h>
void binary_to_ascii(unsigned int value)
{ unsigned int quotient;
quotient=value/10;
if(quotient!=0)
binary_to_ascii(quotient);
putchar(value%10+'0');
}
这个程序是把二进制值转换为字符。因为value%16可能是0~15之间的
任何值,而10~15之间的值应该是以字母A~F来表示。下面的代码是解决
这个问题的一种典型方法。
remainder =value % 16;
if(remainder<10) putchar(remainder+'0');
else putchar(remainder-10+'A');
下面的代码用一种不同的方法解决这个问题:
putchar("0123456789ABCDEF"[value%16]);
这个方法比传统方法要快,因为它所需要的操作更少。但是,它的代码并
不一定比原来的方法更小。虽然指令减少了,但它付出的代价是多了一个
17个字节的字符串常量。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=546626