C语言学习之七——指针_3_字符串

!!!注意:因为的显示格式缘故,所以“ * ”显示会出现问题,可能有些星号由于疏忽未改动格式,造成没有显示,请多多包含,如有错误,请留言或联系本人更正,谢谢!

  1. 字符串与指针
    字符串的存储形式:
    1)数组可以用来存放字符串,见例1

//例1
/#include

void main()
{
char a[] = "I love UNSW!";
printf("%s", a);
}
输出:I love China!
(注:这里的存储方式是,每个数组元素空间内存储一个字符,并以”\0”结束,即这个字符串共占据13个数组单元)


C语言学习之七——指针_3_字符串_第1张图片
字符串在数组中的存储方式

2)用字符指针指向一个字符串,见例2

//例2
/#include

void main()
{
char *a = "I love UNSW!";
printf("%s\n", a);
}
//输出:I love UNSW!
(注:这里的a是一个指针变量,它存储的是字符串"I love UNSW!"的首地址,当调用a时,自动指向字符串"I love UNSW!"的首地址,然后执行后续操作)

  1. 字符串中字符的存取方法
    对字符串中字符的存取,可以用下标方法,也可以用指针方法:
    1)下标法,见例3

//例3
/#include
void main()
{
char a[] = "This summer holiday will be very interesting!", b[50];
int i;
for (i = 0; *(a + i) != '\0'; i++)
{
b[i] = *(a + i);
}
printf("%s\n", b);
}
//输出:This summer holiday will be very interesting!

2)指针法,见例4

//例4
/#include

void main()
{
char a[] = "This summer holiday will be very interesting!", b[50], *p1, *p2;
p1 = a;
p2 = b;
for( ; *p1 != '\0'; p1++, p2++)
{
*p2 = *p1;
}
*p2 = '\0';
printf("String a is: %s\n", a);
printf("String b is: %d\n", b);
}
//输出:String a is: This summer holiday will be very interesting!
String b is: This summer holiday will be very interesting!

(需要注意,这里的存储都是将字符串存储在数组中,即使,例4使用了指针法,但是实质的数据复制存储还是发生在数组单元中的,因为指针变量只能存放地址,即它只是个向导而不是帐篷。这里的帐篷是每个数组存储单元。当然我们也可以不要向导(即指针),如例3,我们只需要有一张地图(即数组的下标可以确定每一个数组单元)和一个起始点(即数组的首地址),然后按照起始点找到下一个帐篷,并把东西(数据)存放进帐篷即可)。

  1. 字符指针变量和字符数组的区别
    3.1虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈。
    主要概括起来有以下几点:
    1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。
    2)赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。
    char str[20];
    str = "I love UNSW!"; (而应,char str[20] = "I love UNSW!";)
    而对字符指针变量,可以采用下面方法赋值:
    char *a;
    a = "I love UNSW!";
    (注意:赋给a的不是字符,而是字符串第一个元素的地址。)
    3)对字符指针变量赋初值:
    char *a=′′I love Fishc.com!′′;
    等价于
    char *a;
    a="I love UNSW!";
    而对数组的初始化:
    char str[20]={"I love UNSW!"};
    不能等价于
    char str[20];
    str[ ]="I love UNSW!";
    4)如果定义了一个字符数组,在编译时为它分配内存单元,内存单元内可以存放数据,并且这些内存单元有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,内存中可以放一个字符变量的地址(即指针)。由此可得,字符数组内存单元存放的是字符数据,而字符指针变量内存放的是字符的地址。
    5)指针变量的值是可以改变的,即指针变量指向的地址是可以改变的,见例5

//例5
/#include

void main()
{
char *a = "I love UNSW!";
printf("%s\n", a);

a += 7;
printf("%s\n", a);
}
//输出:UNSW!

3.2若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。见例6.

//例6
/#include
void main()
{
char *a = "I love UNSW!";
int i;
printf("The sixth character is %c\n", a[5]);
}
//输出:The sixth character is e (注:这里下标为5即为数组中第六个元素,因为数组序列是以0开始)

你可能感兴趣的:(C语言学习之七——指针_3_字符串)