zoukankan      html  css  js  c++  java
  • c++ char *和char []的区别

    一、先看一段程序

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 using namespace std;
     4 int main()
     5 {
     6    char *c1 = "abc";
     7    char c2[] = "abc";
     8    char *c3 = (char*)malloc(3);
     9    c3 = "abc";
    10    printf("%d %d %s %c\n",&c1,c1,c1,*c1);
    11    printf("%d %d %s %c\n",&c2,c2,c2,*c2);
    12    printf("%d %d %s %c\n",&c3,c3,c3,*c3);
    13    getchar();
    14 }

    运行结果为

    2272348 4202624 abc a
    2272344 2272344 abc a
    2272340 4202624 abc a

    二、可见:

    1、这几个字符串的地址&c1,&c2,&c3都不相同,但是char *c1 = "abc"和 c3 = "abc"中c1,c3的地址是相同的。

         这是因为char *c1 = "abc"中,定义了一个字符串常量,存放在global区域。当编译c3 = "abc"时,并没有再生成一个 "abc"字符串,而是在常量区中找到这个字符串,让c3指向它。

         即 char c[] 把内容存在stack , char *c 则把指针存在stack,把内容存在constants.

    2、char c2[] = "abc";c2、&c2的值是一样的。

    3、 printf("%d %d %s %c\n",&c1,c1,c1,*c1);   结果: 2272348 4202624 abc a

            &a 表示a的地址 . 

            a 表示a存储的内容, 因为a是指针, 所以它的内容读取出来就是一个地址 . 

            *a 表示a指针存储的这个地址存储的内容 . 

    ps: *c3="abc"是错误的写法。c3是指针变量,所指的内容是char型。实际上*c3='a'。

    c3 = "abc";这样就没问题了。但此时,c3存储的就是的字符串常量的地址了,所以不能再给c3所指的内容赋值了:c3[0] = 'g';是非法的;

    此外,函数在压栈,一般是先把参数(arguments)压栈,然后才是返回地址。

  • 相关阅读:
    微信小程序开发工具初始化代码仓库
    微信小程序开发如何初始化远程仓库并 PUSH
    Git 提示用户密码错误如何修改
    MariaDB 在创建外键的时候提示 1005 错误
    Fiddler实现移动端手机抓包
    Windows 安装 Go语言开发环境以及使用
    laravel队列,事件简单使用方法
    视图
    laravel Passport
    多台服务器 同时部署一套代码
  • 原文地址:https://www.cnblogs.com/wyqfighting/p/3088264.html
Copyright © 2011-2022 走看看