zoukankan      html  css  js  c++  java
  • char* 和 cha[]

    char* s1 = "hello";//字符串常量

    s是一个保存了字符串首地址的指针变量,同时也是字符串的名字,s的内容是第一个字符的地址,当s指向常量字符串时候,内容不能改变(s[1]='y';错的!因为s[1]就是第二个常量字符的地址,这个地址是唯一的,不能改变!),但是整体可以修改(s = "addd"就可以)。

    cout << s1 ;// "hello"
    cout << *s1; //'h'
    cout << s[0]; // 'h'
    cout << *(s1+1); // 'e'

    char 2s[] = "goodbye";//字符数组

    char s2[]是有连续内存的数组,每个元素是char类型;s2指向的内存区域的地址和容量在生命期里不会改变,但数组里存的内容可以改变。

    13 //s2操作同s1类似
    14 s2 = s1;//错误!!!数组不能用等号赋值(除了初始化)
    15 s1 = s2;//

    两者在内存里都在末位存了‘’

    作为形参完全相同:

    void function(char* s1);
    void function(char s1[]);

    为什么改变s1危险?

    hello字符串是在编译时候就确定了,所以编译器知道它指的是常量,而且不希望你改变;但是数组只是个存储工具,编译时不知道它里面是什么,所以可以改。

    int a=0;    //全局初始化区
    char *p1; //全局未初始化区
    main()
    {
         int b;                  //
         char s[]="abc";  //
         char *p2;           //
         char *p3="123456";   //123456在常量区,p3在栈上。
         static int c=0;     //全局(静态)初始化区
         p2 = (char*)malloc(20);   //分配得来得10和20字节的区域就在堆区。
         strcpy(p1,"123456");   //123456放在常量区,编译器可能会将它与p3所向"123456"优化成一个地方。
     }

    获取字符串长度

    sizeof

    当参数是数组名时,返回的时候数组内元素的个数,包括'';

    当时其他变量时候,返回的是变量所占的字节数;

    char *str1="absde";
    char str2[]="absde";
    
    int len1 = sizeof(str1);//4,因为str1是字符指针变量,占4个字节
    int len2 = sizeof(str2);//6,str2是字符数组名,当sizeof参数是数组名时,返回数组长度(包括'')=6

    所以求字符串常量的长度,使用strlen;求字符数组的长度,使用sizeof,strlen都可以。

    strlen

    参数必须是字符型指针,当数组名作为参数传入时,实际上数组就退化成指针了。

    返回字符串的长度,而strlen不区分是数组还是指针,就读到为止返回长度。而且strlen是不把计入字符串的长度的

    char *str1="absde";
    char str2[]="absde";
    
    int len1 = strlen(str1);//5,strlen不包含''
    int len2 = strlen(str2);//5,strlen不包含''
  • 相关阅读:
    [HAOI2008]硬币购物
    [SCOI2005]骑士精神
    [ZJOI2007]最大半联通子图
    [HAOI2007]反素数
    [SCOI2005]繁忙的都市
    小凯的疑惑
    5月16日vj题解
    周六题目前四题详解
    Codeforces Round #629 (Div. 3)做题记录
    Codeforces Round #570 (Div. 3) B. Equalize Prices
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11264416.html
Copyright © 2011-2022 走看看