用字符数组指向一个字符串,可以不定义字符数组,而定义一个字符指针,用字符指针指向字符串中的字符。例如,
#include<stdio。h>
int main()
{char *str=”C program。”};//等价于 *str=”C progrm。”;
printf(“%s\n”,str);
return 0;
}
在这里,我们在程序中定义了一个字符指针变量str,用字符串常量“C program。”对它进行初始化。C 语言中对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放该字符串常量。对字符指针变量初始化,实际上是把字符串第一个元素(即存放字符串的字符数组的首元素地址)赋给str。 即str指向一个无名的连续存储单元,可通过str++等表达式使str指向该字符串的每一个存储单元。当再一次给str赋另一个地址时,如赋另一个字符串时,原先的字符串所占用的存储单元将“丢失”,即无法再得到它的 。
4 字符数组与字符指针的联系与区别
用字符数组和字符指针都能够实现对字符串的存储和运算,但两者是有区别的,不能混为一谈。一个是变量、一个是数组,其实也是一个变量符号(这个str本身不能改变而已),从这个共同点出发考虑问题,变量的事情,无非就是“存储”、“操作(operate)”两个方面。下面的任务就是详细地分析它们的差异,即两种类型是如何存储的;在操作上的差异,即如何取用(输入输出,赋给别的元素)、如何赋值、如何改变。
(1)定义方式
字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由若干个数组元素组成的,它可用来存放整个字符串。
(2)内存分配
在定义一个字符数组时,编译时已分配内存单元,有确切的地址,而定义一个字符指针变量是,给指针变量分配内存单元,但该指针变具体指向哪个字符串,并不知道,即指针变量存放的地址不确定。设有定义字符型指针变量与字符数组的语句如下:来*自-优=尔,论:文+网www.youerw.com
char *pc,str[100];
则系统将为字符数组str分配100个字节的内存单元,用于存放100 个字符。而系统只为指针变量分配4个存储单元,用于存放一个内存单元地址。
当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。一个错误的例子,如下:
char *pc;
scanf("%s",pc);
printf("%s",pc);
有的编译器虽然也能通过,但这是错误的,因为是个指针,定义时指向不可用的地址。解决这个问题有两种方法:用数组的方法或给字符针针分配内存空间的方法。
数组的方法:
char pc[20];
scanf("%s",pc);
printf("%s",pc);
字符针针分配内存空间的办法:
char *pc,str[10];
p=str[10];
scanf("%s",pc);
但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。