刚学c++ 关于函数和sizeof的一个小问题

K-2SO 2013-01-02 01:15:05

#include "iostream"

using namespace std;

int int_array_length(int*);

int main()
{
int index;
int array[100];
cout << sizeof(array) / sizeof(int) << endl;
cout << int_array_length(array) << endl;
/* for(index=0; index<int_array_length(array); ++index)
{
array[index] = index;
}
for(index=0; index<int_array_length(array); ++index)
{
cout << array[index] << endl;
}
return 0; */
}

int int_array_length(int* array)
{
return sizeof(array) / sizeof(int);
}


输出结果是:
100
2

为什么用函数和在主函数里直接用sizeof来计算结果不一样呢?
求指教
...全文
1879 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin5161678 2013-01-07
  • 打赏
  • 举报
回复
引用 35 楼 ni_kan 的回复:
传递数组后,形参就相当于一个常量指针
void fun(int arr[]){
arr++;
}
int main(){
int arr[101];
fun(arr);
return 0;
}
函数内部那个指针 不是常量 可以赋值 可以++
Simeone_xu 2013-01-07
  • 打赏
  • 举报
回复
来晚了 问题都被解决了
fzyz_sb 2013-01-07
  • 打赏
  • 举报
回复
传递*&即可。
yewenlin 2013-01-05
  • 打赏
  • 举报
回复
#include "iostream" using namespace std; int int_array_length(int*); int main() { int index; int array[100]; cout << sizeof(array) / sizeof(int) << endl; cout << int_array_length(array) << endl; /* for(index=0; index<int_array_length(array); ++index) { array[index] = index; } for(index=0; index<int_array_length(array); ++index) { cout << array[index] << endl; } return 0; */ } int int_array_length(int* array) { return sizeof(array) / sizeof(int); } ================================= 输出应该是:400,1
yujie_v 2013-01-05
  • 打赏
  • 举报
回复
这仅仅是数组传参退化为指针而已。
仙境之桥2046 2013-01-05
  • 打赏
  • 举报
回复
这个是不能这么传的
mcadcj 2013-01-05
  • 打赏
  • 举报
回复
LZ64位系统=。=
QZ 2013-01-05
  • 打赏
  • 举报
回复
学习了 呵呵。。
饭来张 2013-01-05
  • 打赏
  • 举报
回复
函数的参数是没法接受一个数值的,无论参数在定义的时候是指针,还是数值,都会被编译器退化成一个指针。主要是历史原因,当初C刚刚出来的时候,把一个数组的概念传递给一个函数,性能上不好,所以编译器把其退化成指针,性能就ok了。然后这个概念就被一直保留下来。
kevinjean 2013-01-05
  • 打赏
  • 举报
回复
数组当参数传进来的时候,就变成指针了,sizeof,得不到期望的了,用参数传进来
小布 2013-01-04
  • 打赏
  • 举报
回复
楼主你第二个用的是传进来的指针长度除以int长度.
lin5161678 2013-01-04
  • 打赏
  • 举报
回复
引用 24 楼 sugar13 的回复:
C/C++ code?1234567891011121314151617template <class T, int N> int array_length(T (&array)[N] ){ return N;} #include <iostream> int main(){ int a[20]; std::cout << array_lengt……
受教了 我之前忽略了 C++ 中的模板
lin5161678 2013-01-04
  • 打赏
  • 举报
回复
引用 19 楼 steven30832 的回复:
int a[100] 和 int *a = new int[100] 这两个a是不一样的。 虽然两个a都指向数组的首地址,但是代表的单位不一样,前者指向的是一个数组,以整个数组为单位,后者指向的是数据中的首项,以一项为单位。 前者你输出一下 a+1 后者再输出一下 a+1 看看两者在 +1 之后的地址变化就知道了。 直观的说就是前者代表数组,后者……
其实 你这里是 a+1 和 a+1 没区别 +1之后地址变化都是 +sizeof(int) 你说的区别是 int arr[10]; int *parr = new int[10]; &arr+1 和 parr+1 的区别
K-2SO 2013-01-04
  • 打赏
  • 举报
回复
谢谢大家的帮助啊!!!!! 都是牛人啊,,lz我搞明白这个问题了啊哈哈 谢谢大家了!论坛真好。 还有啊~~~ 话说 我自己测试了一下,数组或数组指针做参数的时候sizeof确实返回的是一个相应类型指针的大小~ 但是strlen()这个可以正确返回字符串的字符个数就算是字符串数组做参数~~~啦
wzb56 2013-01-04
  • 打赏
  • 举报
回复
1楼正解。 只要注意一点,就行 数组作为函数参数时,被降级为指针。 sizeof 操作符 放回其操作的对象的所占的内存空间的字节数。 关于这一点,推荐一本书《C++ 必知必会》,基本上一些小问题,都可以解决了。。
everyearr 2013-01-04
  • 打赏
  • 举报
回复
因为垃圾和病毒太多
赵4老师 2013-01-04
  • 打赏
  • 举报
回复
为什么没有人将整个互联网内容当作一个函数的参数传递呢?
everyearr 2013-01-04
  • 打赏
  • 举报
回复
引用 5 楼 daxy223 的回复:
引用 3 楼 daxy223 的回复: 引用 1 楼 jackboos 的回复:int_array_length(int* array); 你传入的是一个整形指针array sizeof(array) / sizeof(int) = 4 / 4 = 1 当然64位是 8 / 4 = 2 我懂了 那怎么才能做到坚持穿进来的数组的size呢? 检查
这个2,跟64或32位没关系,,应该这样理解,int*类型是指针类型,指针类型都是long型; 函数int_array_length中sizeof(array)相当于sizeof(long) sizeof(long)/sizeof(int) 32位结果=2,64位反而=1吧?
ni_kan 2013-01-04
  • 打赏
  • 举报
回复
传递数组后,形参就相当于一个常量指针
andyboliu 2013-01-04
  • 打赏
  • 举报
回复
引用 6 楼 jackboos 的回复:
http://www.cnblogs.com/yqskj/articles/2207168.html
加载更多回复(28)

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧