char*和char[]区别

来源:互联网 发布:mysql field函数 编辑:程序博客网 时间:2024/05/16 18:57

以下内容均来自互联网,是作者自己整理


一、预备知识—程序的内存分配
C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)—由编译器自动分配释放,函数(包括main函数)内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限.

2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,并立即将指针置位NULL,防止产生野指针。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,主要存放静态数据、全局数据和常量,程序结束后由系统释放。

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

int a=0;    //全局初始化区  char *p1;   //全局未初始化区  main()  {     int b;栈     char s[]="abc";   //栈     char *p2;         //栈     char *p3="123456";   //123456\0在常量区,p3在栈上。     static int c=0;   //全局区     p1 = (char*)malloc(10);     p2 = (char*)malloc(20);   //分配得来得10和20字节的区域就在堆区。     strcpy(p1,"123456");   //123456\0放在常量区,编译器可能会将它与p3所向"123456"优化成一个  地方。



二、实例

char *a = "hello" 中的a是指向第一个字符‘a'的一个指针

char a[20] = "hello" 中数组名a也是执行数组第一个字符‘h’的指针

但二者并不相同

看实例:把两个字符串相加:

结果:

对比:

结果:

把字符串加到指针所指的字串上去,出现段错误,本质原因:*d="0123456789"存放在常量区,是无法修的。而数组是存放在中,是可以修改的。两者区别如下:

一. ”读“ ”写“ 能力

  • char *a = "abcd";  此时"abcd"存放在常量区。通过指针只可以访问字符串常量,而不可以改变它。
  • 而char a[20] = "abcd"; 此时 "abcd"存放在栈。可以通过指针去访问和修改数组内容。

二. 赋值时刻

  • char *a = "abcd"; 是在编译时就确定了(因为为常量)。
  • 而char a[20] = "abcd"; 在运行时确定

三. 存取效率

  • char *a = "abcd"; 存于静态区。在栈上的数组比指针所指向字符串快。因此慢
  • 而char a[20] = "abcd"; 存于栈上。快

另外注意:

char a[] = "01234",虽然没有指明字符串的长度,但是此时系统已经开好了,就是大小为6-----'0' '1' '2' '3' '4' '5' '\0',(注意strlen(a)是不计‘\0’)


原创粉丝点击