二维数组的各种sizeof问题

本文通过一个具体的C语言程序示例,详细解析了二维数组的内存地址、大小及访问方式,帮助读者深入理解指针与数组之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()  
{      
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};     
int n=sizeof(a[0][0]);        
printf("a=0x%x,*a=0x%x\n",a,*a);     
printf("a size=%d,*a size=%d\n",sizeof(a),sizeof(*a));     

printf("-------------------------------------------\n");  

printf("a[0]=0x%x,*(a+0)=0x%x\n",a[0],*(a+0));      
printf("a[0] size=%d,*(a+0)=%d\n",sizeof(a[0]),sizeof(*(a+0))); 
printf("-------------------------------------------\n");      


printf("&a[0]=0x%x,&a[0][0]=0x%x\n",&a[0],&a[0][0]);     
printf("&a[0] size=%d,&a[0][0] size=%d\n",sizeof(&a[0]),sizeof(&a[0][0]));     
printf("-------------------------------------------\n");     


printf("a[1]=0x%x,a+1=0x%x\n",a[1],a+1);      
printf("a[1] size=%d,a+1=%d\n",sizeof(a[1]),sizeof(a+1));   
printf("-------------------------------------------\n");   

printf("&a[1][0]=0x%x,*(a+1)+0=0x%x\n",&a[1][0],*(a+1)+0);      
printf("&a[1][0] size=%d,*(a+1)+0 size=%d\n",sizeof(&a[1][0]),sizeof(*(a+1)+0));     
printf("-------------------------------------------\n");     


printf("a[2]=0x%x,*(a+2)=0x%x\n",a[2],*(a+2));      
printf("a[2] size=%d,*(a+2) size=%d\n",sizeof(a[2]),sizeof(*(a+2)));     
printf("--------------------------------------- ---\n");     


printf("&a[2]=0x%x,a+2=0x%x\n",&a[2],a+2);      
printf("&a[2] size=%d,a+2 size=%d\n",sizeof(&a[2]),sizeof(a+2));     
printf("-------------------------------------------\n");   


printf("a[1][0]=0x%x,*(*(a+1)+0)=0x%x\n",a[1][0],*(*(a+1)+0));      
printf("a[1][0] size=%d,*(*(a+1)+0) size=%d\n",sizeof(a[1][0]),sizeof(*(*(a+1)+0)));     
printf("-------------------------------------------\n");    


return 0;      
}


### C语言中使用 `sizeof` 计算二维数组的大小 在C语言中,`sizeof` 运算符可以用于获取不同类型的数据对象占用内存的空间大小。对于多维数组而言,理解其存储方式有助于更精确地计算尺寸。 #### 定义静态二维数组并求解其大小 当声明一个固定大小的二维数组时,可以直接应用 `sizeof` 来获得整个数组占据的总字节数: ```c #include <stdio.h> int main() { int array[3][4]; // 创建了一个具有3行4列的整型二维数组 printf("Size of the whole 2D-array is: %zu bytes\n", sizeof(array)); } ``` 这段程序展示了如何创建一个简单的三维整形数组,并通过调用 `sizeof()` 函数来打印出该数组总共需要多少个字节[^1]。 #### 动态分配二维数组及其大小测量 如果要处理动态分配的二维数组,则情况稍微复杂一些。通常情况下,可以通过指针指向的一级或多级间接寻址实现这种结构。这里给出一种常见的方式——利用单次连续内存块模拟二维布局的方法: ```c #include <stdlib.h> #include <stdio.h> void createDynamicArray(int **arrayPtr, size_t rows, size_t cols){ (*arrayPtr) = (int *)malloc(rows * cols * sizeof(int)); if ((*arrayPtr)) { for(size_t i=0;i<rows;++i){ for(size_t j=0;j<cols;++j){ *((*arrayPtr)+i*cols+j)=rand()%10; } } } } int main(){ int *dynamicArr=NULL; const size_t row_count=5,col_count=7; createDynamicArray(&dynamicArr,row_count,col_count); printf("Allocated memory block size:%zu bytes.\n",row_count*col_count*sizeof(int)); free(dynamicArr); //记得释放资源 } ``` 此代码片段说明了怎样构建一个由单一指针管理的大块线性区域作为逻辑上的矩形网格表示法;同时也示范了如何基于已知维度乘积以及元素类型的宽度推导出实际所需的内存量[^3]。 需要注意的是,在上述例子中并没有直接对所谓的“二维数组”本身取 `sizeof` ,因为一旦脱离编译期确定的具体变量名而转向运行期间操作(即涉及到了 `malloc` 或者其他形式的手动分配),就不再能像对待常规局部或全局命名实体那样方便地查询它们的整体规模了。不过,只要掌握了基础理论知识,就可以很容易地根据上下文条件自行推理得出结论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值