本文仅在博客园发布,认准原文地址:https://www.cnblogs.com/jisuanjizhishizatan/p/15414469.html
问题1:int类型占几个字节?
常见误区:占4个字节。实际上,C语言标准并未规定int类型所占的字节数。因此,在不同的机型上,所输出的结果可能不同。部分较老版本的C编译器,可能int类型是2字节。
问题1-1:char类型占几个字节?
答案是1个字节。C标准规定了sizeof(char)的结果必定为1,不受处理环境影响。
问题2:下面的代码有何错误?
char s1[10];//省略的很多操作if(s1=="123456789")...
很多初学者都会这样写。这样写在语法上没有错误,但是在运行结果上却总会返回错误结果。s1是一个C风格字符串,也就是char类型的数组(或指针),而"123456789"却是字符串常量。把它们使用==运算符进行比较,比较的不是字符串的内容,而是在比较指针。在表达式中,数组如果后面不带[],就会被解释作指针。
如果需要比较C风格字符串,需要使用strcmp函数来比较,这个函数包含在string.h中。因此,上述代码应该改写为这样:
char s1[10];//省略的很多操作if(strcmp(s1,"123456789")==0)...
问题3:下面的代码会正常运行吗?
int a[10],b[10];for(int i=0;i<n;i++){...b=a;}
在代码编写过程中,我们经常会使用“拷贝数组”这一行为,例如动态规划中的滚动数组。然而,上面的代码是无法正常运行的。实际上,数组名b,实际上是&b[0],也就是说,b是一个常量,是不可修改的。因此,数组名在表达式中只能作为右值出现。而指针,其实是可以修改的。但是对于两个指针a和b,执行b=a后,实际上,结果是下面这样:
也就是说,a和b指向同一数组,这显然不是我们想要的。如果要拷贝数组,我们需要使用memcpy函数,同样包含在string.h中。因此,我们应该这样写:
memcpy(b,a,sizeof(a));
这样就可以拷贝数组了。
问题4:const的一些疑问关于const和指针连在一起,经常让初学者们摸不着头脑。例如下面几句:
const char *pchar const *pchar* const pconst char* const p
它们各有什么区别?我这里曾经从《征服C指针》看到了几条非常好的内容,在此给大家分享一下:
因为C语言是美国人发明的,最好还是用英语来读(声明语句)。规则:从后往前倒序,如果遇到*号,就加上“pointer to”,如果有const,就追加“read-only”。const在前面和在后面完全相同。
例如,对const char *p进行翻译:首先看到p:
p is
然后是*:
p is pointer to
然后是char:
p is pointer to char
然后是const:
p is pointer to read-only char
翻译为中文:p是指向只读的char的指针
按照这种方式解释,我们对上面四个语句解释如下:
p is pointer to read-only charp is pointer to read-only charp is read-only pointer to charp is read-only pointer to read-only char
照这样,我们得出结论:const char* p 和char const* p含义完全相同,表示指向的字符是不可变的。char* const p表示指针自身不可变,指向的字符可变。而最后一个,指向的字符和指针自身都不可变。
本期内容到此为止。