小乌龟

在梦想的道路上还能走多远

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
   ChinaUnix上看到有人问了一个问题,程序代码如下:
cout << &("abc"<< endl;        // 输出abc
cout << &(&("abc")) << endl;     // 输出abc
cout << &(&(&("abc"))) << endl;
// 输出abc,好像无论在"abc"前加几个&,输出都为abc
   一个人的评价:
   数组char str[]在内存中存储方式:str和&str是同一个值,也就是说str本身在内存中没有占用空间,str、&str和&str[0]的值是一样的,只是直接给str[]的数组元素分配了空间。指针char *str在内存中的存储方式:首先会给str变量本身分配空间,也就是说str和&str的值肯定是不一样的,&str就是str的地址,在指针初始化后才给指针char *str所指向的字符串明确的分配空间,当然这个空间的首地址就是str的值。所以数组和指针还是有区别的,只是编译器对指针的处理是按照处理数组的方式来处理的。
  这个评价真的是那么正确吗?
   先分析代码:三个输出一样,是因为:取地址运算符只能用于内存中的对象,即变量和数组元素.它不能作用于表达式,常量或register类型的变量(The C Programming Language P93).
   那么字符串常量的返回值是什么呢?是指针变量吗?不像!有人说:怎么不像了,当你把一个字符串常量作为一个参数传递给函数,其行为就像指针啊.那就想想数组,将数组名传递给函数,它的行为也像指针啊.可数组名终究不是指针,只不过作为函数参数时,其退化为了指针.是不是像数组,的确有那种味道.不信就看看下面的测试代码:
#include <stdio.h>

main(
int argc, char *argv[])
{
    
char *p  = "xiexiu";
    
char s[] = "xiexiu";
    
    printf(
"%u\n"sizeof "xiexiu");
    printf(
"%u\n"sizeof p);
    printf(
"%u\n"sizeof s);
    
return 0;
}
   输出结果时:
   7
   4
   7
   既然这样的话,那么数组名是变量还是常量呢?数组名实质上是这个数组的首地址,一旦系统开辟了这块内存,那么这个内存的首地址就不能改变,所以,对数组名的赋值肯定是不允许的。数组名等同于常量,但是还有没有数组名就是常量的说法。这就说明了数组名绝不是变量,当然也不是数组元素了.因此对数组名取地址,要么是未定义,要么是非法的.对字符串常量取地址,很多编译器都可以通过,只是警告一番.因此对于数组str[],str和&str是同一个值的说法是不对,因为&str这个本身不合法或未定义的.
   还有他说:所以数组和指针还是有区别的,只是编译器对指针的处理是按照处理数组的方式来处理的。数组当然和指针有区别了.数组名不是变量,而指针是.编译器对指针的处理是按照处理数组的方式来处理的吗?那么为什么用指针编写的程序比数组的快?
   The C Programming Language P98:在计算数组元素a[i]的值时,C语言实际上先将其转换为*(a+i)的形式,然后再进行求值,这就说明了编译器对数组的处理是按照指针的方式来处理的.同时也说明了为什么用指针编写的程序比用数组编写的快.


posted on 2008-09-09 01:27 小乌龟 阅读(511) 评论(0)  编辑 收藏 引用 所属分类: C&C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理