> 文档中心 > sizeof()求数组长度

sizeof()求数组长度


数组长度

首先要知道一点
数组名就是数组首元素的地址

但是,有两个例外

  1. sizeof(数组名) 数组名表示整个数组,计算的是整个数组的大小

  2. &数组名 数组名表示整个数组,取出的是整个数组的地址

对于一维数组arr[]

确定数组长度:int sz = sizeof(arr)/sizeof(arr[0]);

对于二维数组arr[][]

确定行:sizeof(arr)/sizeof(arr[0]);

确定列:sizeof(arr[0])/sizeof(arr[0][0]);

arr[0]就是数组的第一行

arr[0][0]就是第一行的第一个

--------------------------注意---------------------------

假设一个函数func()

void func(int arr[]){    int sz = sizeof(arr)/sizeof(arr[0]);  printf("%d\n",sz);}

此时结果不为arr[]的长度,而是根据你的编译器类型得出的,如果是32位则sz=1,如果为64位则sz=2

因为这时传入函数的只是数组首地址,其实就是一个指针变量

void func(int arr[]) void func(int *arr)

sizeof(arr) sizeof(int *)

所以函数所求的sz就相当于是int sz = (int*所占字节数)/(int所占字节数)

用二分查找法举例
正确版本:

#include int binary_search(int k,int arr[],int left,int right){while(left <= right)    { int mid = (left + right)/2; if(k < arr[mid]) {     right = mid - 1; } else if(k > arr[mid]) {     left = mid + 1; } else {     return mid; }    }    return 0;    }int main(){    int arr[] = {2,4,7,8,9,10};//    int n = sizeof(&arr);//    printf("%d\n",n);//int型指针字节数    int sz = sizeof(arr)/sizeof(arr[0]);    int left = 0;    int right = sz-1;//    求sz的代码必须放在bin_search()函数外//    因为数组传到函数内的只有数组首地址,本质是int* arr,最后sz=int型指针占字节数/int型变量字节数    int m = binary_search(7,arr,left,right);    if(m) printf("下标:%d\n",m);    else printf("找不到\n");}

在这里插入图片描述

错误版本❌:

#include int binary_search(int k,int arr[]){    int sz = sizeof(arr)/sizeof(arr[0]);    int left = 0;    int right = sz-1;    while(left <= right)    { int mid = (left + right)/2; if(k < arr[mid]) {     right = mid - 1; } else if(k > arr[mid]) {     left = mid + 1; } else {     return mid; }    }    return 0;    }int main(){    int arr[] = {2,4,7,8,9,10};    int m = binary_search(7,arr);    if(m) printf("下标:%d\n",m);    else printf("找不到\n");}

在这里插入图片描述
此处sz=2。因为我是64位编译器,如果是32位就为1