最近在阅读《c和指针》这本书,对c语言的分析很不错,这是继《C++ primer》之后感觉又一部比较适合我阅读的书了,值得推荐,其中有些比较有趣的用法拿出来和大家分享。首先我们回忆关于字符数组和字符串常量的区别,比较下面两个语句:
char p[] = “hello world!”;
char* p = “hello world!”;
第一个为字符数组的初始化,包含13个字符,注意最后有个’\0’,第二个为初始化指针变量,它指向字符串常量的存储位置。我们知道计算机的数据有三个存储区:静态存储区、栈和堆,第一个字符串存在栈区,第二个指向静态存储区。
当字符串常量出现于表达式中时,它的值是个指针常量。编译器把这些指定字符的一份拷贝存储在内存的某个位置,并存储一个指向第一个字符的指针。
下面的表达式是什么意思呢?
“xyz”+1
当你记得字符串常量实际是个指针时,它的意义就变得清楚了,它计算指针值加1的值,它的结果是个指针,指向字符串第二个字符:y
那么这个表达式又是什么呢?
*”xyz”
对一个指针执行间接访问操作,其结果就是指针所指向的内容。所以它的值是指向的字符:x,注意不是整个字符串。
下一个写法更奇怪,
”xyz”[2]是什么意思呢?
根据以上知识,我们可以推断出应该是z。
由此,我们把二进制转化为字符的实现可以很简单的实现:
unsigned value;
putchar(“0123456789ABCDEF”[value%16]);
思考下面的神奇函数的意义。
#include <stdio.h>
void mystery(int n)
{
n += 5;
n /= 10;
printf(“**********”+ 10 - n);
}
char p[] = “hello world!”;
char* p = “hello world!”;
第一个为字符数组的初始化,包含13个字符,注意最后有个’\0’,第二个为初始化指针变量,它指向字符串常量的存储位置。我们知道计算机的数据有三个存储区:静态存储区、栈和堆,第一个字符串存在栈区,第二个指向静态存储区。
当字符串常量出现于表达式中时,它的值是个指针常量。编译器把这些指定字符的一份拷贝存储在内存的某个位置,并存储一个指向第一个字符的指针。
下面的表达式是什么意思呢?
“xyz”+1
当你记得字符串常量实际是个指针时,它的意义就变得清楚了,它计算指针值加1的值,它的结果是个指针,指向字符串第二个字符:y
那么这个表达式又是什么呢?
*”xyz”
对一个指针执行间接访问操作,其结果就是指针所指向的内容。所以它的值是指向的字符:x,注意不是整个字符串。
下一个写法更奇怪,
”xyz”[2]是什么意思呢?
根据以上知识,我们可以推断出应该是z。
由此,我们把二进制转化为字符的实现可以很简单的实现:
unsigned value;
putchar(“0123456789ABCDEF”[value%16]);
思考下面的神奇函数的意义。
#include <stdio.h>
void mystery(int n)
{
n += 5;
n /= 10;
printf(“**********”+ 10 - n);
}