c/C++计算int / int *数组的长度;sizeof(指针),sizeof(数组名)的区别
1.计算int *数组长度:
1 2 3 4 5 6 7 8 9 10 | int arrayVlenth( float *p) { int len = 0; while (*p) { p++; len++; } return len; } |
sizeof(指针),sizeof(数组名)的区别:
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include<iostream> void fun( int *E) { std::cout<< "函数指针形参:" << sizeof (E)<<std::endl; } int main() { int A[10]; int *B = new int [10]; //int *&C = A //会报错 int *&D = B; std::cout<< "数组名:" << sizeof (A)<<std::endl; std::cout<< "指针:" << sizeof (B)<<std::endl; std::cout<< "指针引用:" << sizeof (D)<<std::endl; fun(A); } |
结果:
1 2 3 4 | 数组名:40 指针:8 指针引用:8 函数指针形参:8 |
当sizeof的参数是数组名时,计算的是整个数组的存储大小;当sizeof的参数是指针时,计算的是指针的大小(8字节,64位系统)。而且,可以定义对指针的引用,但却不能用数组名来作为指针引用的右值,可见数组名和指针还是有区别的。同时,将数组名作为实参传入函数时,因为形参是指针,所以在函数体内的其实是通过数组名初始化的指针形参,故不能在函数中通过 sizeof(指针形参)/sizeof(数组元素类型) 来计算数组长度。所以一般将数组名作为形参传入函数时,也会同时传递一个数组长度的参数。
以上参考自:https://blog.csdn.net/u012707739/article/details/75732159
函数通过参数传入一个数组的指针,如何获取该数组的长度?
如 int InsertSort(int* array)
其中array的长度如何获取?
用过sizeof(array) / sizeof(int),始终是1
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
sizeof是在编译阶段展开的一个宏
错误,函数参数在运行阶段以压栈方式传递了一个地址
int mylen(int buf[])
{
return sizeof(buf) / sizeof(int);
}
正确,因为buf的分配过程是在编译阶段定义。
int main(void)
{
int buf[] = {0, 0, 0, 0};
int l =sizeof(buf) / sizeof(int);
printf("%d\n", l);
system("pause");
return 0;
}
C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。
#define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )
template<class T>
int getArrayLen(T& array)
{
return sizeof(array)/sizeof(array[0]);
}
原文:https://blog.csdn.net/arcticfoxhan/article/details/38752703
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具