【c和指针学习笔记】深入理解字符串常量

来源:互联网 发布:苹果6手机壳淘宝 编辑:程序博客网 时间:2024/05/01 08:56
思考下列表达式代表什么意思???
//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]);elsecout << 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 )‘\’的作用:转移字符,将字符转化为数字




0 0