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

    程序的内存分配

    一个由C/C++编译的程序占用的内存分为以下几个部分

    1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其

    操作方式类似于数据结构中的栈。

    2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回

    收 。

    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的

    全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另

    一块区域。 - 程序结束后由系统释放。

    4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放

    5、程序代码区—存放函数体的二进制代码。


    二、例子程序  
    //main.cpp  


    int a = 0; 全局初始化区  

    char *p1; 全局未初始化区  

    main()  
    {  

    int b; 栈  

    char s[] = "abc"; 栈  

    char *p2; 栈  

    char *p3 = "123456"; 123456在常量区,p3在栈上。  

    static int c =0; 全局(静态)初始化区  

    p1 = (char *)malloc(10);  

    p2 = (char *)malloc(20);  

    分配得来得10和20字节的区域就在堆区。 

    strcpy(p1, "123456"); 123456放在常量区,编译器可能会将它与p3所指向的"123456"

    优化成一个地方。 

    }  

    数组不是基本类型,不能直接参与比较,数组与字符串及字符指针与字符串比较其实比较的是二者的地址。

    例:

    int isequiv(char *t)
    {
    if (t == "char")
    return 1;
    else
    return 0;
    }

    int main()
    {
    char test[] = "char";
    char *temp = "char";
    printf("%d", isequiv(test));//输出 0
    printf("%d", isequiv(temp));//输出 1
    return 0;
    }

    那么为甚么test与temp同字符串“char”比较时结果会不一样呢?其实t=="char"比较的是地址!

    首先,当你这么引用一个字符串的时候 "char",它表示存储在程序的常量区的一串字符串,它返回的就是这个常量区的字符串地址比如假设这个地址是 0x004038b0 "char",那么当你使用 char *temp = "char";的时候,temp就得到了这个常量字符串的地址,也就是temp等于 0x004038b0  
    或许你可以试试

    char* p1 = "char";
    char* p2 = "char";
    char* p3 = "char";
    char* p4 = "char";

    这里的 p1 p2 p3 p4 的值都一样,都是指向常量区字符串 "char", 比如上面的 0x004038b0  
    然而当你这么只用的时候 
    char test[] = "char";  
    这里情况就和上面的不一样了,这样写的时候,编译器并不是让test也指向常量区的字符串"char",而是在本地堆栈分配了一段和"char"一样大的空间,如何把常量区字符串"char" 拷贝到test
     
    可以这么理解
    char* p1 = "char"; p1 和 常量区的"char"是同一个东西,地址相同
    char test[] = "char"; test和 常量区的"char"不是同一个东西,但是内容相同
     


    int isequiv(char *t)
    {
    if (t == "char")
    return 1;
    else
    return 0;
    }

    以上面为例子
     
    当你这么比较的时候  if (t == "char") 编译器是去比较t和"char"是不是同一个东西,它们的值(字符串的地址)是不是一样,而不是比较它们的内容是不是一样
     由前面的讲解可以知道
    char* p1 = "char";    p1 和"char"的值是一样的
    char test[] = "char";  test 和 "char"的值不一样,只是它们指向的字符串内容一样而已
     要比较两个字符串的内容是不是一样,用 strcmp()返回0就是一样
     比如,你那个函数可以改为
     

    int isequiv(char *t)
    {
    if (strcmp(t, "char") == 0)
    return 1;
    else
    return 0;
    }

    ps:你要理解两个感念,
     
    同一个东西
    内容相同的两个东西

    注:字符串比较用用strcmp()函数,strcmp(test,"char")及strcmp(temp,"char")!

  • 相关阅读:
    Mock
    JMeter分布式并发
    APP常见的性能测试指标
    Jmeter模拟微信用户
    jmeter性能测试
    小程序测试注意点
    性能测试常见瓶颈及调优方法
    常见的性能缺陷
    测试理论知识(一)
    ISO9126质量模型
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/9600931.html
Copyright © 2011-2022 走看看