• 字符数组与字符串指针


    字符数组:

    数组名是一个指针常量,不能直接赋值,即 char str[10]; str = "abcd";

    不能出现对数组名的自加或者自减,即str++, str--;

     1 //字符数组(C风格字符串)
     2 int main(){
     3     char str1[] = "abc";
     4     char str2[] = {'a', 'b', 'c'};//不以空字符结束,产生未定义行为
     5     char str3[] = {"abc"};
     6     char str4[] = {'a', 'b', 'c', ''};
     7     printf("str1: %s
    ", str1);
     8     printf("str2: %s
    ", str2);
     9     printf("str3: %s
    ", str3);
    10     printf("str4: %s
    ", str4);
    11     return 0;
    12 }

    上述printf后的结果,除了第二个str2可能超出abc的长度,其他三个都是等价的,结果为abc。

    当使用数组时真正用的是指向数组首元素的地址。str1[2] = (str1 + 2)所指向的元素。


    字符串指针:

    指向常量数据区,不能更改指向常量的内容,即不能有*p=XXXXX;

    可以改变字符指针变量的值,即p本身,p=XXX。

    1 int main(){
    2     char *p1 = "abc";
    3     char *p2 = p1 + 1;
    4     printf("p1: %s
    ", p1);
    5     printf("p2: %s
    ", p2);
    6     return 0;
    7 }

    p1是常量字符串abc的首地址,输出结果是abc。p2是“abc”第二个字符的地址,输出结果是bc。

     1 int main(){
     2     const char str1[] = "abc";
     3     const char str2[] = "abc";
     4     const char *p1 = "abc";
     5     const char *p2 = "abc";
     6 
     7     printf("%d %d %d %d", str1, str2, p1, p2);
     8     return 0;
     9 }
    10 //结果是str1和str2地址不一样
    11 //p1和p2地址相同

    str1和str2是两个字符数组的首地址;p1和p2是字符串常量的地址,而该字符串常量是一样的,所以p1和p2的值都是字符串常量abc的值。

    查看了str1和str2的值,二者相差了4,而且是str1>str2,这也证明了C++中栈的生长方向是向下的,向着内存地址减小的方向增长。

    详细的关于C/C++堆、栈等数据区内容。

    ※※※※关于strlen, sizeof()的用法

  • 相关阅读:
    Markdown
    DNS解析流程
    maven 的各种命令
    ES6初体验——(1)let和const命令
    table相关的选择器 & children()与find()的区别 & 选择器eq(n)与nth-child(n)的差异
    Java MD5加密类
    POI操作Excel异常Cannot get a text value from a numeric cell
    MyEclipse+SSH开发环境配置
    JdbcTemplate详解
    Spring配置声明
  • 原文地址:https://www.cnblogs.com/cnblogsnearby/p/4683435.html
Copyright © 2020-2023  润新知