char*和char[ ]的区别

Last updated on 8 months ago

关于此类的问题都放在这里了,不另起文章了

基础知识

遇到了一道题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
char *fun1() {
char *x = "abcd";
return x;
}
char *fun2() {
char str[] = "abcd"; //存放在静态数据区
return str;
}
int main() {
cout << fun1() << endl; //abcd
cout << fun2() << endl; //
system("pause");
}

这两个输出是怎样的?
第一时间就意识到 函数调用结束后,这些变量不是都被回收了吗,那应该不存在才对 (想到的是栈的特性)

于是上机一测,发现fun1是有输出的,fun2没有, 哦? 那这样说明 字符常量不是在栈里分配内存的?

原来 字符串常量也是存储在静态存储区,那这样就是说,char *x 指向的内存没有被回收,嗯,这样就说的通了

而 char str[] 呢? 前几天遇到一个题目 strlen(“abcd”) 结果是? 第一次看到这个 ,有点蒙,“abcd” 也是变量吗?
上机一测还真是 4 个字节,尝试下 cout << &”abcd” << endl; 发现这也是有地址的!!!! 所以也说的通了,

char str[] 是个字符数组,字符数组是有占用空间的, 在执行 char str[] = “abcd” 时候,发生了一次拷贝将
内存”abcd”拷贝到str数组中,函数结束运行的时候,str的空间也被回收了,而对于char *p 而言,回收的只是这个 p的指针(指针也是变量)

还有个实验完全可以证明, 字符串常量是在 静态存储区

image-20220311235052265

尽管fun1结束了,打印“abcd”的地址还是和fun1运行时的一样

总结 : fun1 中的 x执行的内存是 是在 静态存储区 不是堆也不是栈
fun2 中的 str保存在栈中


sizeof 和 strlen的用法区别 小结

  • sizeof是关键字 获取某个数据类型所占用空间的字节数

  • strlen是函数可以看有多少个字符 以 ‘\0’ 结束

  • 典型问题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     char *str = "abcdd";     //  abcdd 在一片连续内存中,并且占用了6个字节  最后一个字节是 '\0'  注意:str的指针指向这一片 内存地址
    char strp[] = "asdfe"; // 上文说过是 asdfe拷贝到strp字符数里面 strp里面有 6个字节大小
    cout << strlen(str) << endl; //5 遇到最后一个 '\0' 就结束了
    cout << sizeof(str) << endl; //4 对str这个变量的类型大小计算 str是个字符指针 所以是4个字节
    cout << strlen(strp) << endl; //5 遇到最后一个 '\0' 就结束了
    cout << sizeof(strp) << endl; //6 对strp这个变量类型大小计算 strp是个字符数组,计算整个数组的字节数大小

    /*----------*/
    char p[] = {'a', 'b', 'c', 'd','c','\0'};
    char q[] = {'a', 'b', 'c', 'd','c'}; //这种情况下末尾是不带 '\0' 的
    cout << strlen(q) << endl; //没有 '\0' 结束标志 结果为止
    cout << strlen(p) << endl; //5 有结束标志

    cout << sizeof(q) <<endl; // 5 直接找到数组的大小
    cout << sizeof(p) <<endl; // 7


    总结: 这种就是要注意 字符后面有无带 结束标志 ‘\0’ , sizeof是统计 对象类型所占的空间 strlen 是遍历内存遇到 ‘\0’ 结束

    image-20220316195022149

字符串 反转打印

要求是手动拷贝,做这个题目的时候太多东西都忘记了….cao ,其实就是没有深刻的理解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main() {
//
char a[] = "abcdef";
// strlen 遇到 ‘\0’就停止
int len = strlen(a);

char *p = (char *)malloc(len+1);

char *s = &a[len-1];
char *t = p;
while (len--) {
*p++ = *s--;
}
p[len + 1] = '\0';

printf("%s", t);

system("pause");
}