Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 386, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

杂谈:数组、指针的区别和联系

做了几年的C/C++,回头看看,编程最重要的还是基本概念。上午同事让我看一个程序,下面是源码:
int main(int argc, char* argv[])
{
 char* str1 = "123";
 char* str2 = "123";

 const char* str3 = "123";
 const char* str4 = "123";

 char str5[] = "abc";
 char str6[] = "abc";


 if(str1 == str2)
 {
  printf("1\n");
 }

 if(str3 == str4)
 {
  printf("2\n");
 }

 if(str5 == str6)
 {
  printf("3\n");
 }
 if(!strcmp(str5,str6))
 {
  printf("4\n");
 }

 return 0;
}

其实这里考察的是指针和数组的区别。指针和数组在传参时没什么区别,指针的效率更高。其它时候个数组名可作为指针常量,不能修改。在这个例子中,char str5[] = "abc"意味者给数组str5在栈中分配分配一块内存空间,存储的是字符串“abc”;str5也是同样的意思。它们是两个数组,只不过放的值一样而已。上面的代码C和C++下执行结构是一样的,但是有些细节是不一样的.指针不是数组,数组也不是指针。值得注意的是strcmp函数,形参是const char *,数组名刚好就是一个const char *;但是这个函数也可以用于普通的指针,参数传参实际上是个赋值过程。
数组的创建不是在栈区就是在全局区,指针就是内存的别名。指针的长度是固定的,数组则不一定。sizeof操作符在数组和指针中的值是不一样的。工作后,在回头理解那些基本的概念,感觉不一样的。


附注:指向数组指针,本质还是个二维指针,不过一维的维数是固定的。
char (*p)[82];-----------------------------声明一个指向数组的指针p,这个指针的步长是一个82个长度的字符数组
p=(char(*)[82])(5*82);-------------------给指针p分配内存
memcpy(*p,"abcd")-----------------------给指针赋值,不能用*p=“abcd”;这里就可以看出数组和指针、字符串的区别

posted on 2008-08-25 22:20 Benjamin 阅读(329) 评论(0)  编辑 收藏 引用 所属分类: C/C++


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