sizeof的问题,高手指教一下.

x-teamer团队 2009-10-22 09:17:52
char arr[] = "abcdefg";
char const *pointer = "abcdefg";



cout << sizeof(pointer) <<endl;
cout << sizeof(arr)<<endl;

我的理解是:
"abcdefg"是常量字符串,

arr和pointer都是指向常量的字符串指针,

但sizeof凭什么让这两个东东的值变得不一样了?


灰常不解.
...全文
357 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
youqika 2010-03-30
  • 打赏
  • 举报
回复
个人理解是,数组在编译时就能确定大小的,编译器看到sizeof(addr)就认为你
要的addr数组的大小,而不是认为你要这个数组首地址的大小
指针就不一样了,编译器看到sizeof(pointer)认为你
要的是pointer这个变量的大小
虽然本质上二者都是指针,但addr是只读的,pointer是变量,但这不是编译器对
二者区别对待的原因
2009-10-24
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 spider_boy 的回复:]
arr数组名代表的是数组第一个元素的地址,而pointer则是指向字符串第一个字符地址的指针。一个是地址,一个是指向地址的指针所以他们所占的字节数是不同的。地址占8个字节,指针占4个字节。
不知道此说法是否真确呢?
[/Quote]
一塌糊涂
spider_boy 2009-10-24
  • 打赏
  • 举报
回复
arr数组名代表的是数组第一个元素的地址,而pointer则是指向字符串第一个字符地址的指针。一个是地址,一个是指向地址的指针所以他们所占的字节数是不同的。地址占8个字节,指针占4个字节。
不知道此说法是否真确呢?
walkersfaint 2009-10-24
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 unsv29mj 的回复:]
C/C++ codechar arr[6]="abcdefg";char*pointer="abcdefg";


cout<<sizeof(pointer)<<endl;
cout<<sizeof(arr)<<endl;

试试这样 情况下 是否一样??

[/Quote]
肯定不一样
pmerOFc 2009-10-24
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 hpsmouse 的回复:]
引用 29 楼 spider_boy 的回复:
arr数组名代表的是数组第一个元素的地址,而pointer则是指向字符串第一个字符地址的指针。一个是地址,一个是指向地址的指针所以他们所占的字节数是不同的。地址占8个字节,指针占4个字节。
不知道此说法是否真确呢?

一塌糊涂
[/Quote]

"指向地址的指针"
这种混话都是跟老谭学的
lizhi200404520 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 zhangmingxingwei 的回复:]
这两个值肯定不是一样的。下面具体分析sizeof。
在MSDN上面,sizeof的定义是:
首先看一MSDN上如何对sizeof进行定义的:

sizeof Operator

sizeof expression

The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type
(including aggregate types). This keyword returns a value of type size_t.

The expression is either an identifier or a type-cast expression (a type specifier enclosed in
parentheses).

When applied to a structure type or variable, sizeof returns the actual size, which may include
padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof
returns the size of the entire array. The sizeof operator cannot return the size of dynamically
allocated arrays or external arrays.
例子说明:
第一个例子:

char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 结果 1 ===》*ss是第一个字符

char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1,也就是ss在内存中的大小
sizeof(*ss) 结果 1 ===》*ss是第一个字符

char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1

int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4

char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p);
结果是 4 3

第二个例子:

class X
{
int i;
int j;
char k;
};
X x;
cout < <sizeof(X) < <endl; 结果 12 ===》内存补齐
cout < <sizeof(x) < <endl; 结果 12 同上

第三个例子:

char szPath[MAX_PATH]

  如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)

[/Quote]
看着个好
userlon 2009-10-23
  • 打赏
  • 举报
回复
arr是数组,sizeof返回数组大小;pointer是个指针,sizeof返回指针大小:4
pmerOFc 2009-10-22
  • 打赏
  • 举报
回复
不同的东西
sizeof一样还是不一样都没什么大惊小怪的
dushuchen 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 ostrichmyself 的回复:]
char arr[] = "abcdefg";
char const *pointer = "abcdefg";


cout < < sizeof(pointer) < <endl;
cout < < sizeof(arr) < <endl;

我的理解是:
"abcdefg"是常量字符串,

arr和pointer都是指向常量的字符串指针,

但sizeof凭什么让这两个东东的值变得不一样了?


灰常不解.
[/Quote]

记住就行了sizeof(pointer) = 4 //pointer是指针,得出指针本身所占字节数,32位系统一般4个字节

sizeof(arr) = 8 //别忘了末尾的‘/0’占了一个字节

都是面试常考的


ChRedfield 2009-10-22
  • 打赏
  • 举报
回复
arr 是数组的首地址 一个char型数组每元素在内存中占 1byte.

pointer 是一个指针,win32甭管什么类型的指针在内存中都是 4byte
slowgrace 2009-10-22
  • 打赏
  • 举报
回复
而sizeof(pointer)返回的是pointer这个指针变量的大小,在32位系统中,指针变量的大小为4字节。
slowgrace 2009-10-22
  • 打赏
  • 举报
回复
当数组标识符被用作sizeof的操作数时,数组标识符代表整个数组。因此,sizeof(arr)返回的是整个数组的大小。

数组arr初始化对应的字符串有7个字符,但C的字符串末尾会被自动加入'\0'表示字符串结束。因此数组arr的大小为7+1=8个字节。
unsv29mj 2009-10-22
  • 打赏
  • 举报
回复
char arr[6] = "abcdefg"; 
char *pointer = "abcdefg";


cout < < sizeof(pointer) < <endl;
cout < < sizeof(arr) < <endl;


试试这样 情况下 是否一样??
DaiDaoDeRen 2009-10-22
  • 打赏
  • 举报
回复
1L正解
unsv29mj 2009-10-22
  • 打赏
  • 举报
回复
有些编译器你若添加某些关键字 你甚至可以自行改变指针的长度!!!
unsv29mj 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 ostrichmyself 的回复:]
char arr[] = "abcdefg";
char const *pointer = "abcdefg";


cout < < sizeof(pointer) < <endl;
cout < < sizeof(arr) < <endl;

我的理解是:
"abcdefg"是常量字符串,

arr和pointer都是指向常量的字符串指针,

但sizeof凭什么让这两个东东的值变得不一样了?


灰常不解.
[/Quote]

这两个指针的长度不管他,与C语言本身无关!!!
cattycat 2009-10-22
  • 打赏
  • 举报
回复
第一个是字符数组,可以修改其中的值,第二个才是指针,指向常量字符串,值不能修改。
ljzh12 2009-10-22
  • 打赏
  • 举报
回复
数组名在sizeof和单目运算符取地址&中并没有转换为指针,参见c和指针
ljzh12 2009-10-22
  • 打赏
  • 举报
回复
数组名在单目运算符sizeof和取地址&中并没有转换为指针,参见c和指针
arong1234 2009-10-22
  • 打赏
  • 举报
回复
sorry,我回的是5楼
[Quote=引用 5 楼 chenyu2202863 的回复:]
字符串要在末尾自动加上'\0',而数组则没有这个功能
[/Quote]
[Quote=引用 8 楼 arong1234 的回复:]
怎么和这个扯上了?这和指针、数组区别没有关系
引用 3 楼 buptzwp 的回复:
arr并不是指针,只是指向了数组的首地址。

[/Quote]
加载更多回复(13)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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