数组名是指针,为什么sizeof(数组名)还是数组的大小
数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多人就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:" 数组名就是指针"。这种误解的根源在于国内某著名的C程序设计教程(出版量最多的那本书),但不可否认,在入门的时候这样理解起来简单了不少。数组名的内涵在于其指代实体是一种 数据结构,这种数据结构就是数组;数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个 指针常量;指向数组的指针则是另外一种变量类型,仅仅意味着数组的存放地址!
u8 a[40];
sizeof(a)为什么等于40呢,因为数组这种结构保存了数组的大小,有的书说这个值保存在数组首地址前面的内存中(这一点,我没验证)。最简单的方法你就记着,数组名不是普通的指针。
strlen (C语言函数) 【内容来自百度百科】
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。- 函数原型:extern unsigned int strlen(char *s);
- 头文件:string.h
- 格式:strlen (字符数组名)
- 功能:计算给定字符串的(unsigned int型)长度,不包括'\0'在内
- 说明:返回s的长度,不包括结束符NUL。
strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。
char aa[10];cout<<strlen(aa)<<endl; //结果是不定的
char aa[10]={'\0'}; cout<<strlen(aa)<<endl; //结果为0
char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3(此处不完全正确,结果可能是不定的,如果编译器将其他的非零字符串放在aa[10]的内存地址后,strlen结果还是不定的,MSP430在IAR编译测试过)(但是在vc6中结果为3,编译器会在“处自动添上\0。)
char aa[6]="hello";cout<<strlen(aa)<<endl; //结果5(此处不完全正确,理由如上,因为实际内存中,hello后面不一定是空(即\0))(还应视编译器而定)
而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个取字节运算符,strlen是函数。
sizeof(aa) 返回10
一个简单的例子:
软件是MDK-ARM Professional Version:5.11.0.0int main(void)
{
u8 a[7]={0};
u8 b[5]={1,2,3};
u8 *p;
a[0]=strlen(b);
a[1]=sizeof(b);
a[2]=sizeof(p);
b[4]=1;
a[3]=strlen(b);
a[4]=sizeof(b);
b[3]=1;
a[5]=strlen(b);
a[6]=sizeof(b);
}
这是执行到b[4]=1;之前的内存情况(使用的是32位单片机,所以int型占4个字节)
这是执行到b[3]=1;之前的内存情况
这是程序结束时的内存情况(sizeof和strlen终于是一样的结果了)