• c语言,数组和字符串


    1. “数组名代表了数组的存储首地址,是一个地址常量”。

    对于char *p1 = "A String."; 

    和 

    char p2[] = "Another String."; 

    这两种写法的不同:

    p1指向的这个字符串是个常量, 不可改变, 程序在编译期间就为"A String."这个字符串分配了固定的空间, 它被存储在全局静态区中.

    而p2是个变量, 其内容可以被更新和改变, 同时p2可以理解为一个不可改变其指向位置的指针, 即char * const p2, 它所占用的内存在程序运行时被自动分配和释放, 而p1占用的内存要等到整个程序结束时才被释放.

     

    TEST:
    #include <stdio.h>
    int g; // 存储在全局静态区
    int main()
    {
    char* p1 = "haha"; // 和g一样存储在全局静态区
    char p2[] = "haha"; // 堆栈中
    printf("%x %x %x", &g, p1, p2);
    }
    你可以看出p1和g的位置距离很近, 而和p2相隔很远, 可以看出他们的确是被存储在不同的内存空间中的, 而且p1所指向的内容是常量, 不能改变, 不信你试试:
    char* p = "This is the penalty!";
    
    *p = 't';//段错误
    

      

    所以声明指向常量字符串的指针时最好这样:

    const char* p = "...";

    另外任何出现在程序中以" "括起的内容如果不是被存储在变量中那么它就是常量, 和上面的p1指向的类型相同, 比如:

    printf("abc %d", 1);

    其中的"abc %d"也是常量;

    2、运行char a[] = ”abc”后,内存会开辟几块内存,这此内存共占多少个字节?

     答:

    开辟1块内存。完毕后空间和数据都释放。

    a是地址常量不能改,而其中的内容可以改

    char a[4]="str";

    char b[4]="str";

    printf(" a=%d,b=%d ",a,b);//a=-1080595620,b=-1080595624

    3、运行char *p = ”abc”后,内存会开辟几块内存,这此内存共占多少个字节?

     答:开辟两块内存,栈空间中存放的是指针变量p占4个字节,字符常量区存放的字符串"abc"占4个字节。

  • 相关阅读:
    批量更新sql |批量update sql
    智力测试题3
    【管理心得之二十一】管得少就是管得好
    查看sqlserver被锁的表以及如何解锁
    AD域相关的属性和C#操作AD域
    毕业5年小结一下
    WPF版公司的自动签到程序
    用友畅捷通高级前端笔试题(一)凭借回忆写出
    .NET中制做对象的副本(三)通过序列化和反序列化为复杂对象制作副本
    .NET中制做对象的副本(二)继承对象之间的数据拷贝
  • 原文地址:https://www.cnblogs.com/mylinux/p/4667723.html
Copyright © 2020-2023  润新知