编译器工作原理:在64位的计算机中,当创建一个指针变量时,计算机会为它分配8个字节的存储空间。但如果创建的是数组呢?计算机会为数组分配存储空间,但不会为数组变量分配任何空间,编译器仅在出现它的地方把它替换成数组的起始地址。
结论1:由于计算机没有为数组变量分配空间,也就不能把它指向其他地方。例题:
char s[]="How big is it?"; char *t=s; //正确,将数组的地址赋给指针变量t s=t; //错误,数组变量没有存储空间,无法存储指针变量t的值,编译报错
结论2:如果对数组变量使用取地址符&,结果是数组变量本身。
#include <stdio.h> int main(int argc, char *argv[]) { int arr[3]={1,2,3}; printf("arr=%p\n",arr); printf("&arr=%p\n",&arr); return 0; } 结果为: [email protected]:~$ ./t arr=0x7ffed97ce8d0 &arr=0x7ffed97ce8d0
结论3:sizeof(数组)的值是数组的大小,sizeof(指针)是操作系统上一个地址的大小,64位机上是8个字节,32位机上是4个字节。
#include <stdio.h> int main(int argc, char *argv[]) { int arr[3]={1,2,3}; int *p=arr; printf("sizeof(arr)=%d\n",(int)sizeof(arr)); printf("sizeof(p)=%d\n",(int)sizeof(p)); return 0; } 输出: [email protected]:~$ ./t sizeof(arr)=12 sizeof(p)=8
通过结论3可知:假如把数组变量赋给一个指针,那么指针变量只会包含数组的地址信息,而对数组的长度一无所知,相当于指针丢失了一些信息。我们把这种信息的丢失称为退化。只要把数组变量传递给函数,数组免不了退化为指针,所以,把数组传递给函数,需要明确的指明数组的大小。向这样:
int arr[3]={1,2,3}; int sum_arr(int arr[],int n); //用整型变量n明确指出数组大小
时间: 2024-10-12 15:46:14