设为首页 加入收藏

TOP

char *p 与char p[] 比较(一)
2014-04-06 17:35:42 来源: 作者: 【 】 浏览:162
Tags:char    比较

  所有的字符窜常量都被放在静态内存区

  因为字符串常量很少需要修改,放在静态内存区会提高效率

  例:

  char str1[] = "abc";

  char str2[] = "abc";

  const char str3[] = "abc";

  const char str4[] = "abc";

  const char *str5 = "abc";

  const char *str6 = "abc";

  char *str7 = "abc";

  char *str8 = "abc";

  cout << ( str1 == str2 ) << endl;

  cout << ( str3 == str4 ) << endl;

  cout << ( str5 == str6 ) << endl;

  cout << ( str7 == str8 ) << endl;

  结果是:0 0 1 1

  str1,str2,str3,str4是数组变量,它们有各自的内存空间;

  而str5,str6,str7,str8是指针,它们指向相同的常量区域。

  char *c = "chengxu"

  "chengxu"的类型是const char *,编译器在编译时会在静态数据区为"chengxu"分配空间存储这个字符串,然后将字符串的首地址赋给字符指针char *c 。到于const char *赋给char *是因为在c语言时代这已成为一种习惯写法。所以,当使用指针c试图改变"chengxu"时,如:c[0]='a',编译不会出错,但运行时会出错。改成

  char c[]="chengxu"就不会出错了。char c[]="chengxu"先在内存开辟一连续存储单元,然后将字符串存到存储单元。

  函数中可以返回已经申请空间的局部变量的指针。

  char *str()

  {

     char *t ;

     t=(char*)maloc(50) ;

     return t ;

  }

  问题的引入:

  看看下面的程序的输出:

  #include

  char *returnStr()

  {

  char *p="hello world!";

  return p;

  }

  int main()

  {

  char *str=NULL;//一定要初始化,好习惯

  str=returnStr();

  printf("%s\n", str);

  return 0;

  }

  这个没有任何问题,因为"hello world!"是一个字符串常量,存放在静态数据区,把该字符串常量存放的静态数据区的首地址赋值给了指针,所以returnStr函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。

   

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++中数据对齐问题 下一篇C++中的Virtual Function&nb..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言指针从入门到基 (2025-12-26 05:21:36)
·【C语言指针初阶】C (2025-12-26 05:21:33)
·C语言指针的定义和使 (2025-12-26 05:21:31)
·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)