前面我们讲的指针都指向基本数据类型,除了数组之外,还有一个比较复杂的数据类型就是字符串,前面我们学到字符串用双引号表示,在内存中存储是以”\0”作为缺省结束标志。实际上字符串完全可以用数组来表示。因为使用的内存都是按顺序的线性存储。并且空间在申明时就已经确定。如下图所示是两种字符串变量的声明方式。

C语言基本概念(4)_内存

在内存中如下存储,注意最后的一个位置是”\0”,所有string[]数组的长度是14,不是13。并且如果采用元素赋值的方法定义一个字符串时,需要在将最后一个元素设置为“\0”,才能认为它是一个字符串。

C语言基本概念(4)_内存_02 

从上图看出,区别一个字符串和一个字符数组的最大区别是就有没有‘\0”标识。如char a[]={‘a’,'b’,’c’}与char a[] =”abc”就不一样,首先前面数组只有三个元素,后面有四个元素。

C语言基本概念(4)_空间_03

由前面两种字符串变量的定义方式,我们这里引申出C/C++中,如何划分内存,通常在C/C++编译器将内存划分为5个区,分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。其中,栈是由编译器划分,通常用来存储局部变量、函数参数,不需要时这块内存会自动清除。堆是由使用NEW分配的内存块,编译器不去维护,由应用程序自已delete,同样,类似的,自由存储区,是由malloc分配,并用free结束。而全局和静态存储区用来存储全局变量和静态变量。不论是否初始化的全局变量均占用这一块内存。而常量存储区,存放的是常量,缺省情况下是不允许修改。如char *str=”I am a string”;这就是一个常量,它存储在常量存储区。如下例子:

C语言基本概念(4)_内存_04

从这里我们可以看出字符数组与字符指针变量的不同,字符数组由多个元素组成,每个元素存放一个字符。而字符指针变量存放是字符串常量的首地址。由此得出不同的赋值方式,字符数组除了初始化外,申明之后赋值必须按元素进行赋值。而字符指针变量是可以采用如下方法赋值:char *a ; a=”I love China.com!'”;从这里可以看出数组是内存预分配出来的,而字符串指针实际上并没有分配内存,只是将指针变量指向首地址。

C语言基本概念(4)_内存_05

指针变量可以指向一个数组,可以指向一个字符串,那当然也可以指向一个函数的首地址。因为每个函数在编译时都会分配一个首地址。

C语言基本概念(4)_C语言_06