strlen(char*)与sizeof()的区别
与sizeof()的区别
strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。
char
char
char
而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。
sizeof(aa)
int
----------------------------------------------------------
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是操作符(关键字),strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
sizeof还可以用函数做参数,比如:
short
printf("%d\n",
输出的结果是sizeof(short),即2。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序
char
int
int
6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
8.当适用了于一个结构类型时或变量,
当适用一静态地空间数组,
sizeof
9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
如:
fun(char
fun(char
都等价于
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小
如果想在函数内知道数组的大小,
进入函数后用memcpy拷贝出来,长度由另一个形参传进去
fun(unsiged
{
unsigned
memcpy(buf,
}
我们能常在用到
看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:
char
int
int
----------------------------------------------------------
上面是对静态数组处理的结果,如果是对指针,结果就不一样了
char*
sizeof(ss)
长整型的,所以是4
sizeof(*ss)
型的,占了
strlen(ss)=
sizeof返回对象所占用的字节大小.
strlen返回字符个数.
在使用sizeof时,有一个很特别的情况,就是数组名到指针蜕变,
char
sizeof(Array)
char
strlen(p)
在传递一个数组名到一个函数中时,它会完全退化为一个指针
----------------------------------------------------------
看完以上你是否很清楚sizeof和strlen的区别了呢?还不明白的话,我们看下面几个例子:
第一个例子
char*
sizeof(ss)
sizeof(*ss)
大部分编译程序
这就是sizeof(x)可以用来定义数组维数的原因
char
int
int
char
sizeof(ss)
sizeof(*ss)
char
sizeof(ss)
strlen(ss)
int
sizeof(ss)
strlen(ss)
char
char
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是
第二个例子
class
{
int
int
char
};
X
cout<<sizeof(X)<<endl;
cout<<sizeof(x)<<endl;
第三个例子
char
如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void
还有一位网友的说明也很好:
其实理解
程序存储分布有三个区域:栈、静态和动态。能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的指针来间接操作的。
char
sizeof(static_string)
char
sizeof(stack_string)
char
strncpy(string,
sizeof(string)
不管指针指向的内容在什么地方,sizeof
C++
struct
{
int
};
int
{
O
cout
cout
system("PAUSE");
}
r