前言 数据存储区域:
1、栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
2、堆:就是那些由new或malloc分配的内存块,在不适用时,要手动用delete或free来释放内存区域。
3、 存储全局/静态区:全局变量和静态变量被分配到同一块内存中,他们共同占用同一块内存区。
4、 常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)
char *a = "hello";
char b[3] = "world";
char *a 存储在常量存储区,不能执行赋值操作,char *s定义了一个char型的指针,它只知道所指向的内存单元,并不知道这个内存单元有多大,所以当char *s = "hello";后,不能使用s[0]='a';语句进行赋值。这是将提示内存不能为"written"。
但charb[] 存放在栈区域内,可以修改,也就是常规的数组操作
char *s1 = "hello";
char s2[] = "hello";
char *s3 = s2; //★注意这句必须要★
char **s4 = &s3; //s2(char[])要用两步才能完成赋值
char **s5 = &s1; //s1(char*) 只需一步
char(*s6)[6] = &s2; //&s2等价于char(*)[6]:指向包含6个char型元素的一维数组的指针变量
printf("\n size of s1: %d \n", sizeof(s1));
printf("\n size of s2: %d \n", sizeof(s2));
对函数进行传递参数时,char *和char[]都直接使用地址传递,当传递的函数参量为const char*p时,直接使用(a)/(b)就可以。