在学习指针的时候,获得指针的定义和数组的定义同样,可是这时候就很好奇,指针只是一个地址,那数组和指针同样的话,sizeof时怎么得知其长度呢。数组
因而百度了下面的回复:函数
千万不要把数组名当作指针,尽管有些时候他们是相通的,但也仅限某些时候而已。
sizeof是一个奇特的函数,告诉你你也许不相信——sizeof在编译的时候就已经肯定sizeof的结果了,这有点相似于宏。
学习
char str[] = “Hello” ; sizeof ( str );//输出为6
编译器编译的时候根据上下文彻底知道str是一个数组,sizeof (str ) = 6 理所固然是在求数组所占字节数,这个字节数在编译期间就能够肯定(数组的大小必须在编译前指定好,C语言规定)
spa
void *p = malloc( 100 ); sizeof ( p );//输出为4
编译器看到p是个指针,但是谁能保证指针所指内存的大小呢?尽管你这里写着100,可是malloc但是动态分配,没人敢保证malloc必定返回100个字节,甚至好比你不调用malloc,调用一个本身写的函数,编译器总之是没法在编译期间就肯定指针所指内存大小的,而sizeof又必须在编译期间知道结果,那好,sizeof只好返回指针自己所占内存的大小,32位机上是4个字节,64位机上是8个字节。
指针
void Func ( char str[100]) { sizeof( str ); //输出为4 }
数组做为参数时,编译器在编译期间一概编译为指针,这样尽管你定义str为数组,实际上在编译器眼里后等同于:code
void Func ( char * str) { sizeof( str );//输出为4 }
数组做为参数时,一概被编译器编译为指针。blog