为什么sizeof一直是四。。。

int main(void)
{
char name[40];
printf("sizeof:%d\n", sizeof(name));
printf("what's your name?\n");
scanf("%s", name);
cmp(name);

return 0;
}

void cmp(char* name)
{
printf("strlen:%d\n", strlen(name));
printf("sizeof:%d\n", sizeof(name));
}

因为将数组传递到函数里后,数组就退化为指针了,也就是说只有在定义数组的那个函数里才能得到数组的sizeof。以下几种写法是等价的:

void f(int *a);
void f(int a[]);
void f(int a[10]);
void f(int a[100]); // 这个数字是没用的,会被忽略掉
void f(int a[20][10]); // 但这个就不能被忽略了,被忽略的是20

追问

数组名不就是个指针吗
char name[40];
printf("sizeof:%d\n", sizeof(name));

追答

不是的,数组虽然在大多数情况下会被转化为指针,但数组和指针是不一样的,不一样的地方有以下几点:

    sizeof不同,数组的sizeof会反应这个数组真实所占的内存大小;而指针在32位系统中永远是4,所有类型的指针sizeof都一样。

    数组不能被直接赋值,int a[10]; a = b; 这种代码是编译不过的;而指针如果不定义成const类型的,是可以修改指向的内容的:int *p = &a; p = b; 是可以的。

而什么时候数组会变成指针?只要有计算,有参数传递的地方都会变成指针,例如:

int a[10];
int *p;
sizeof(a); // 这里没有计算,得到40
sizeof(a+1); // 这里有计算了,数组就变成了指针,结果是4
void f(int a[10]) {
    sizeof(a)  // 虽然参数里写的是a[10],但其实还是指针,结果是4
}

追问

那是什么原理造成他们两个有这么一点差别呢、
数组名是一个特殊的指针?
怎么理解呢

追答

可以将指针理解为一个特殊的指针
至于什么原理:我想是因为C中的数组天生就和指针密不可分,数组名的值就是内存的起始地址,而指针也是地址,所以数组名基本上可以当做指针来用。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-24
这是C语言的奇葩。函数参数 char 也好 int 也好 都是 4。double 可能是 8
就算你给了数组大小,char 也好 int 也好 。。。
例如:
void cmp(char name[40]){
printf("sizeof:%d\n", sizeof(name));
}
void cmp(int name[40]){
printf("sizeof:%d\n", sizeof(name));
}
统统 是 4。本回答被网友采纳
第2个回答  2013-09-23
数组做型参时,数组名称当作指针使用!!
void fun(char p[])
{sizeof(p)等于4}
在你的程序中你用name是数组名,所以一直是4追问

数组名不就是个指针吗
char name[40];
printf("sizeof:%d\n", sizeof(name));

数组名不就是个指针吗
char name[40];
printf("sizeof:%d\n", sizeof(name));

第3个回答  2013-09-24
#include <stdio.h>
#include <string.h>
void cmp(char (*name)[40]);
int main(void)
{
char name[40];
printf("sizeof:%d\n", sizeof(name));
printf("what's your name?\n");
scanf("%s", name);
cmp(&name);
return 0;
}

void cmp(char (*name)[40])
{
printf("strlen:%d\n", strlen(*name));
printf("sizeof:%d\n", sizeof(*name));
}

LS都不给正确的解决办法,这里给出解决办法
第4个回答  2013-09-23
第一个是计算数组所占字节,应该是40,第二个是计算指针所占字节,应该是4追问

数组名不就是个指针吗
char name[40];
printf("sizeof:%d\n", sizeof(name));

追答

数组名不能完全看成指针,当作为函数的参数时确实是指针。sizeof(数组名)就是返回数组所占字节,这个你理解不了就记住哈

追问

那是什么原理造成他们两个有这么一点差别呢、
数组名是一个特殊的指针?
怎么理解呢

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网