对于字符数组与字符指针:
1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc\0".
2. 字符串直接量作为字符指针的初始值
*ptr = “hello”; 等价于const char *ptr = “hello”;字符串直接量"hello"关联的是只读内存,如果试图修改将出错,例如ptr[1]
= ‘a’;是会引起错误的。
3. 字符串直接量作为基于栈的字符数组的初始值
4. 字符数组与字符指针
5. 类型的决定
s2[4],s1的类型就是char[3],s2的类型就是char[4],也就是说尽管s1和s2都是字符数组,但两者的类型却是不同的。
char[7],也就是说实际的数据存储为"abcdef\0"。
对于sizeof与strlen:
1. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned
int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
2. sizeof是运算符,strlen是函数。
3. sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
4. 数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5. 大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因。
6. strlen的结果要在运行的时候才能计算出来,是用来计算字符串的实际长度,不是类型占内存的大小。
7. sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
8. 当适用于一个结构类型或变量,sizeof 返回实际的大小,
总结一下:
1). sizeof的结果是类型的大小,区分类型之后,sizeof的结果也就命了,sizeof的结果是在编译期决定的,计算的占据的内存大小。
3). sizeof(express),其中的express在编译过程中是不会被编译的,而是被替代类型。
4). 对函数使用sizeof,在编译阶段会被替换为函数的返回值的类型取代
关于strlen的一个例子:
#include "stdio.h"
char array3[]={'H','E','L','L','O',’\0’};
char array4[6]={'H','E','L','L','O'};//自动在后面补0;
printf("%d\n",strlen(array3));//结果为5;
printf("%d\n",strlen(array4));//结果为5
字符数据有两种用户,存储字符串和存储字符数组,它们的区别是字符串的结尾系统会自动加上'\0',而字符数组是没有的,想让它成为字符串必有人工加上'\0',而strlen是计算字符串(以'\0'结尾的字符数组)的函数,如果没有’\0’,计算的结果会出错。