char c[]和char *c

首先需知道程序所占用的内存的分区形式:

eg://main.cpp

int a=0;   //全局初始化区

char *p1; //全局未初始化区

main ()

{

int b;//栈

char s[]="abc"; //栈

char *p2;  //栈

static int c=0;//全局静态初始化区

p1=(char*)malloc(10);

p2=(char*)malloc(20);//分配得来的10和20字节的区域在堆区

strcpy(p1,"123456");//123456\0放在常量区

}

程序的内存分配:

1、栈区-由编译器自动分配释放,存放函数的参数值,局部变量的值。其操作方式类似于数据结构中的栈。

2、堆区-一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式类似于链表。

3、全局区(静态区)-全局变量和静态变量的存数是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

程序结束后由系统释放。

4、文字常量区-常量字符串就是放在这里的。程序结束后由系统释放。

5、程序代码区

堆和栈申请后系统的响应:

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该

结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的

delete语句才能正确的释放内存空间。另外,当找到的堆结点的大小大于所申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

申请大小的限制:

栈:在windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域。就是说栈顶的地址和栈顶的最大容量是系统预先设定好的,如果申请的空间超过栈的

剩余空间时,将提示overfollow。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。因为系统是用链表来存储的空闲内存地址,自然是不连续的,而链表的遍历方向是由低地址向高地址。

堆的大小受限于计算机系统中有效的虚拟内存。

堆和栈的存储内容:

栈:在函数调用时,第一个进栈的是函数调用语句的下一条可执行语句的地址,然后是函数的各个参数,在大多数的c编译器中,参数是由右往左入栈的,然后是

函数中的局部变量。注意:静态变量是不入栈的。

堆:一般是在堆的头部用一个字节存储堆的大小。堆中的具体内容由程序员安排。

在原例子中;

区别1:

char s1[]="ab";

s1[0]=‘a‘;;//true

char *s2="ab";

s2[0]=‘a‘;//false

区别2:

sizeof(s1)=3;//数组的大小

sizeof(s2)=4;//指针的大小

时间: 2024-08-24 15:21:06

char c[]和char *c的相关文章

char 与 unsigned char的本质区别

在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别. 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-127~127,unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字. 在实际使用过程种有什么区别呢?主要是符号位,但是在普通的赋值,读写文

const char*、char*、char* const、char[]、string的区别

1.const char* p: p is a pointer to const char(char const* p 一样)   意思就是不能通过p指针来修改p指向的内容(但是内容可以修改).2.char* p      : p is a pointer to char   意思就是可通过p指针来修改p指向的内容3.char* const p: p is a const pointer to char   意思就是p指针是一个常指针,他指向的内存地址不能变,定义的时候就得初始化   一旦给指针

char 与 unsigned char之间的坑

在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字. 在实际使用过程种有什么区别呢? 主要是符号位,但是在普通的赋值,读写

C语言char s[] 和 char *s的区别

C语言char s[] 和 char *s的区别,下面这个回答讲解的很清晰. The difference here is that char *s = "Hello world"; will place Hello world in the read-only parts of the memory and making s a pointer to that, making any writing operation on this memory illegal. While do

char*,const char*和string 三者转换

1. const char* 和string 转换 (1) const char*转换为 string,直接赋值即可. EX: const char* tmp = "tsinghua". string s = tmp; (2) string转换为const char*,利用c_str() EX:  string s = "tsinghua"; const char*tmp = s.c_str(); 2. char*和const char*之间的转换 (1) cons

char、signed char、unsigned char的区别

ANSI C 提供了3种字符类型,分别是char.signed char.unsigned char char相当于signed char或者unsigned char,但是这取决于编译器! 这三种字符类型都是按照1个字节存储的,可以保存256个不同的值. 不同的是取值范围signed char取值范围是 -128 到 127unsigned char 取值范围是 0 到 255 signed char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,

char *p 与char p[] 比较

所有的字符窜常量都被放在静态内存区 因为字符串常量很少需要修改,放在静态内存区会提高效率 例: char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char *str5 = "abc"; const char *str6 = "abc";

char *s 和 char s[] 的区别小结

目前中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误.一时也不能说得很明白,网上也搜了一下相关文章发现一些写的比较好的,综合了一下当教育资料备用. char *s1 = "hello";char s2[] = "hello"; [区别所在] char *s1 的s1,而指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容

char与unsigned char 区别

char 与 unsigned char的本质区别 http://bbs.csdn.net/topics/270080484 同一个内存内容:10010000 你用char*   解释是-112 你用unsigned   char*   解释是144 还是同样这个内存内容赋给整型值,用unsigned   char   类型还是会得到144,用char类型的就会是负数. 真正的差别还是取决于你的程序.某些情况这两种类型表示都行. 补充一下: char 可能是signed char,也可能是uns

C++中const char * const name;char * const name;cons

C++中const char * const name;char * const name;const char * name三者之间的区别? 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:HG Zhao链接:http://www.zhihu.com/question/26908463/answer/34499495来源:知乎 const *说明指向的是常量.* const说明指针是常量.const * const说明指针和指向的都是常量.