zoukankan      html  css  js  c++  java
  • char a[] = "hello world1"和char *p = "hello world2";的区别(转)

    转自:jianchi88
    http://blog.csdn.net/jianchi88/article/details/6876405
    #include<stdio.h>
    int main()
    {
        char a[] = "hello world1";
        char *p = "hello world2";
        *(a+1)='q';
        *(p+1)='q';
        printf("%s
    ",a);
        printf("%s
    ",p);
    }

    运行结果

    段错误。

    注释 *(p+1)='q';

    运行结果

    hqllo world1

    hello world2

    原因:

    一、a与p类型不同:p为指向字符串的指针;a为保存字符串的数组。

        char a[] = "hello world1";   是个赋初值的字符数组。
      char *p = "hello world2";  是个字符串常量指针;

    指针变量p在栈里面

    字符串常量"hello world2"在全局数据区,数据段,只读,不可写


    二、"hello world2"和"hello world1"字符串保存的位置不同。"hello world1"保存在栈
        中,可用*(a+1)='q'修改,"hello world2"保存在全局数据
        区,位置是在.rodata中,不能修改*(p+1)='q'


    三、只有2中情况下,数组名不可等同视为数组指针,&与sizeof操作符
        “&”的区别:
        &p取得是指针变量的地址,而非字符串"hello world2"的首地址,p指向字符串的首地址;&a取得
        就是字符串"hello"的首地址。
        “siziof”的区别:
        下面假设在ia32平台上运行,保存变量的内存空间不同。
        sizeof(p); // return 4, pointer size
        sizeof(a); // return 13, array size

    5               char a[] = "hello world1";  
    (gdb) p a         
    $1 = "00<06޿�05޿�?�"//
    (gdb) s  
    6               char *p = "hello world2";  
    (gdb) p a         
    $2 = "hello world1"  
    (gdb) p &a  
    $3 = (char (*)[13]) 0xbfde0583  //在栈  
    (gdb) s  
    7               *(a+1)='q';  
    (gdb) p p  
    $4 = 0x80484c0 "hello world2"  //在数据段  
    (gdb) p &p  
    $5 = (char **) 0xbfde0590   //在栈  

    ————————————————————————————————————————————————————————————————————————————————————————————

    面试题知识点:

      当指针赋值给相同的常量字符串时,它们实际上会指向相同的内存地址,但是常量内存初始化数组,情况确不一样。

    char str1[] = "hello world";
    char str2[] = "hello world";
    string* str3 = "hello world";
    string* str4 = "hello world";
    问str1 == str2是否成立?str3 == str4是否成立?
    (提示,前一个不成立,后一个成立)
        char a[] = "hello world";
        char b[] = "hello world";
        char *str1="hello world";
        char *str2="hello world";
    
    前两个不同,后两个相同,即a!=b;str1==str2;
  • 相关阅读:
    riot.js教程【三】访问DOM元素、使用jquery、mount输入参数、riotjs标签的生命周期
    博客园文章编辑器5.0版本发布(markdown版)
    【开源】博客园文章编辑器4.0版发布
    博客园文章编辑器【客户端应用程序】V3.0.0发布
    博客园文章编辑器【客户端应用程序】V2.0.0发布,命名为51cnblogs
    在VSCode中编辑HTML文档时,在Dom标签上写style属性时智能提示的问题
    产品经理做什么?
    riot.js教程【二】组件撰写准则、预处理器、标签样式和装配方法
    riot.js教程【一】简介
    程序员的时间管理哲学——打造自己的分时管理系统
  • 原文地址:https://www.cnblogs.com/XDJjy/p/3946619.html
Copyright © 2011-2022 走看看