c语言 字符数组 字符指针 sizeof strlen 的区别

直接给代码

char *c="abcdef";
char d[]="abcdef";
char e[]={'a','b','c','d','e','f'};
printf("sizeof(c):%d\tstrlen(c):%d\n",sizeof(c),strlen(c));
printf("sizeof(d):%d\tstrlen(d):%d\n",sizeof(d),strlen(d));
printf("sizeof(e):%d\tstrlen(e):%d\n",sizeof(e),strlen(e));

输出结果是
4 6
7 6
6 14
求原因,最好是把根本原因说出来,这些数据在内存中怎么存放,机器读取时候的机制,谢谢!

c语言 字符数组、字符指针、sizeof strlen的区别为:数据长度不同、操作不同、所占空间不同。

一、数据长度不同

1、字符数组:字符数组需要在初始化时就定义字符数组的数据长度。

2、字符指针:字符指针的数据长度由指针指向的字符数据决定。

3、sizeof strlen:sizeof strlen自动确定sizeof strlen的数据长度。

二、操作不同

1、字符数组:字符数组里的数据内容可以进行增删改操作。

2、字符指针:字符指针只是展示指向的字符数据,字符指针里的数据内容不可以进行增删改操作。

3、sizeof strlen:sizeof strlen里的数据内容可以进行增删改操作。

三、所占空间不同

1、字符数组:字符数组的所占空间以初始化时定义的数据长度决定,不会发生改变。

2、字符指针:字符指针的所占空间较小,只存放指向字符数据的指针地址。

3、sizeof strlen:sizeof strlen的所占空间根据现有的数据长度自动发生改变。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-09
  简单概括,strlen()返回的是字符数组或者字符指针中的元素个数,sizeof返回的是字符数组中所有元素所占的总字节数,对于字符指针,返回的只是指针所占的字节数,32位系统上都是4字节。具体来说有如下几点区别:

  1. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
  2. sizeof是算符,strlen是函数。
  3. sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
  4. 数组做sizeof的参数不退化,传递给strlen就退化为指针了。
  5. 大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因。
  char str[20]="0123456789"; // str是编译期大小已经固定的数组
  int a=strlen(str); // a=10; //strlen()在运行起确定,计算的是实际长度
  int b=sizeof(str); // 而b=20; //sizeof()在编译期确定,str的类型是int[20],计算的是占据内存的大小

  6. strlen的结果要在运行的时候才能计算出来,是用来计算字符串的实际长度,不是类型占内存的大小。
  7. sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
  char c;
  sizeof c; //变量名可以不加括弧
  8. 当适用于一个结构类型或变量, sizeof 返回实际的大小,
  当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
  sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
第2个回答  2009-11-03
sizeof(xxx)是个保留字,用来求分配给xxx的内存空间大小的,举例来说sizeof(int)就是求分配给int型变量的内存大小

sizeof(c):因为c是一个指针,指针一般分配4字节,于是结果就是4
sizeof(d):d是个未指定大小的字符串,大小会根据后面初始化的实际内容自动分配,又后面是个字符串,字符串最后是有个'\0'的,因此其分配的字节数就是6+1=7
sizeof(e):e是个未指定大小的字符数组,大小会根据后面初始化的实际内容自动分配,又后面是6个字符,而这不是字符串不需要补'\0',因此结果就是6

strlen(const char*)这是个字符串相关函数,其中,参数必须是个字符指针(指向字符串的指针)或字符串,而返回值就是这个指针指向的字符串的长度,字符串结束必须以'\0'为标记,但'\0'不计入字符串长度

strlen(c),c是指向字符串"abcdef\0"的指针,返回的是"abcdef"的长度6
strlen(d),d是字符串"abcdef\0",然后同上
strlen(e),由于e[]不是个字符串,仅仅是字符数组,所以理论上不应该做strlen()操作,但是这里求出来的是14,尝试输出e看看得到
abcdef烫abcdef
内存分配如下
...|abcdef|??abcdef\0...
其中|...|内的就是分配给e的内存空间,??是未初始化的部分,【后面的"abcdef\0"估计是分配空间初始化时为保证安全性自动在内存中填充的东西,而"abcdef??abcdef"显然占用了14个字节,所以输出的14(这里用不同编译器得到的结果可能不一样)】嗯 这个地方是说错了,后面那部分确实是d的内容,感谢幻の上帝指出

如果你将这句话改为:
char e[7]={'a','b','c','d','e','f'};
它初始化后就会在最后添加'\0'使结果为6(VC++6.0)
不过建议还是写作:
char e[7]={'a','b','c','d','e','f','\0'};
以后遇到字符串操作一定记住在操作完末尾补'\0',否则很容易出问题!
第3个回答  2009-11-03
sizeof 是求得实体(就是"()"里面包含的变量或者类型字)的字节单位长度。按照类型来判断

strlen 是求得字符的长度,累加搜索,直到 \0截至为止。
第4个回答  2009-11-03
sizeof 是求变量或类型的存储长度。
strlen 是统计字符串中字符的个数,不包括终止符‘\0’.
例如字符数组e
每个数组元素e[]是一个字符,共占6字节(B)而他非字符串,一位前两个是字符串所以长度要加终止符‘\0'。c与d无太大区别,c是指针指向那个字符串。d是以数组形式存储的字符串。
e数组中有2个‘{',6个字符常量例如'a',6个'.'。
我讲的不知道你明白吗。希望您能采纳。
相似回答