思考下列表达式代表什么意思???
//1:“zyh_helen”+ 1
//2: *“zyh_helen”
//3:“zyh_helen”[2]。
如果你觉得上述表达式不了解,甚至认为他们看上去像垃圾的话,你有必要阅读本篇文章
首先对“字符串常量”这个话题进行深入的讨论:
当一个字符串常量出现在表达式中时,他的值是一个指针常量。编译器把这些指定字符的一份拷贝存储在内存中的某个位置,并存储一个指向第一个字符的指针。
你可能会联想到,当数组名用于表达式中时,他们的值也是指针常量(例如:int a[10],a++ ++a --a a--都是不合法的),但是我们可以对他们进行下标引用、间接访问以及指针运算。这些操作对于字符串常量是否也有意义呢?
答案是肯定的,如下所示:
1:“zyh_helen”+ 1 ,字符串出现在表达式中时,他的值是一个指针常量,指向字符串中的第一个字符(知道字符串常量实际是一个常量指针,该问题就迎刃而解了)-->“指针加1”,结果仍是一个指针,它指向字符串中的第2个字符。
2:*“zyh_helen”,对指针进行间接访问操作,其结果就是指针所指的内容,字符串常量的类型是“指向字符的指针”,结果即为它所指向的字符‘z’
3:“zyh_helen”[2],该表达式的值即为字符:‘h’
你可能会问起,人们什么时候会使用上面这些形式的表达式呢?下面的例子是一个很好的解释
已下程序实现:无符号十进制数转化为16进制,并且打印出来
方式一:
void int_to_hex1(unsigned int n)
{
char array[8];
int count = 0;
while (n)
{
array[count++] = n % 16;
n >>= 4;
}
for (int i = count - 1; i >= 0; --i)
{
if (array[i] <= 9)
printf("%d", array[i]);
else
cout << array[i]-10+'A';
}
cout << endl;
}
方式二:
void int_to_hex3(unsigned int n)
{
char array[8];//32位二进制--->8位16进制(最多需要)
int count = 0;
while (n)
{
array[count++] = "0123456789ABCDEF"[n % 16];
n >>= 4;
}
for (int i = count - 1; i >= 0; --i)
{
cout << array[i];
}
cout << endl;
}
显然方式一得代码比较复杂,因为字母和数字在字符集中并不是相邻的,方式二定义了一个字符串,使子母和数字相邻,从而避免了这种复杂性,余数将在字符串中选择一个正确的数字。
方式二比传统的方式要快,因为它所需要的操作更少,但是,它的代码并不一定比原来的方法更小,虽然指令减少了,但它付出的代价是多了一个17个字节(‘\0’不要忽略了)的代价。
下面例子也是字符串常量的一个应用:(统计一个十进制数:二进制表示中1的个数)
int count(int num)
{
int count = 0;
while (num)
{
count += "\0\1\1\2\1\2\2\3\1\2\2\3\2\3\3\4"[num % 16];
num >>= 4;
}
return count;
}
每次取num的后四位,判断有多少个1(4位表示的数值:0--15,0到15,二进制中1的个数分别为0 1 1 2 1 2 2 3 1 2 2 3 2 3 3 4 )‘\’的作用:转移字符,将字符转化为数字