char*和char[ ]的区别
Last updated on 8 months ago
关于此类的问题都放在这里了,不另起文章了
基础知识
遇到了一道题目:
1 |
|
这两个输出是怎样的?
第一时间就意识到 函数调用结束后,这些变量不是都被回收了吗,那应该不存在才对 (想到的是栈的特性)
于是上机一测,发现fun1是有输出的,fun2没有, 哦? 那这样说明 字符常量不是在栈里分配内存的?
原来 字符串常量也是存储在静态存储区,那这样就是说,char *x 指向的内存没有被回收,嗯,这样就说的通了
而 char str[] 呢? 前几天遇到一个题目 strlen(“abcd”) 结果是? 第一次看到这个 ,有点蒙,“abcd” 也是变量吗?
上机一测还真是 4 个字节,尝试下 cout << &”abcd” << endl; 发现这也是有地址的!!!! 所以也说的通了,
char str[] 是个字符数组,字符数组是有占用空间的, 在执行 char str[] = “abcd” 时候,发生了一次拷贝将
内存”abcd”拷贝到str数组中,函数结束运行的时候,str的空间也被回收了,而对于char *p 而言,回收的只是这个 p的指针(指针也是变量)
还有个实验完全可以证明, 字符串常量是在 静态存储区
尽管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
17char *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’ 结束
字符串 反转打印
要求是手动拷贝,做这个题目的时候太多东西都忘记了….cao ,其实就是没有深刻的理解
1 |
|