问题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后,实际上,结果是下面这样:

【原创】C语言和C++常见误区(一)_正常运行

也就是说,a和b指向同一数组,这显然不是我们想要的。如果要拷贝数组,我们需要使用memcpy函数,同样包含在string.h中。因此,我们应该这样写:

memcpy(b,a,sizeof(a));


这样就可以拷贝数组了。



问题4:const的一些疑问

关于const和指针连在一起,经常让初学者们摸不着头脑。

例如下面几句:

const char *p
char const *p
char* const p
const 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 char
p is pointer to read-only char
p is read-only pointer to char
p is read-only pointer to read-only char

照这样,我们得出结论:

const char* p 和char const* p含义完全相同,表示指向的字符是不可变的。

char* const p表示指针自身不可变,指向的字符可变。

而最后一个,指向的字符和指针自身都不可变。

本期内容到此为止。