Administrator
发布于 2022-03-12 / 6 阅读
0
0

char*和char[ ]的区别

char\*和char\[ \]的区别

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

基础知识

遇到了一道题目:


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’ 结束
  • 典型问题

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 ,其实就是没有深刻的理解


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");
}


评论