!!!注意:因为简书的显示格式缘故,所以“ * ”显示会出现问题,可能有些星号由于疏忽未改动格式,造成没有显示,请多多包含,如有错误,请留言或联系本人更正,谢谢!
- 字符串与指针
字符串的存储形式:
1)数组可以用来存放字符串,见例1
//例1
/#include<stdio.h>void main()
{
char a[] = "I love UNSW!";
printf("%s", a);
}
输出:I love China!
(注:这里的存储方式是,每个数组元素空间内存储一个字符,并以”\0”结束,即这个字符串共占据13个数组单元)
2)用字符指针指向一个字符串,见例2
//例2
/#include<stdio.h>void main()
{
char *a = "I love UNSW!";
printf("%s\n", a);
}
//输出:I love UNSW!
(注:这里的a是一个指针变量,它存储的是字符串"I love UNSW!"的首地址,当调用a时,自动指向字符串"I love UNSW!"的首地址,然后执行后续操作)
- 字符串中字符的存取方法
对字符串中字符的存取,可以用下标方法,也可以用指针方法:
1)下标法,见例3
//例3
/#include<stdio.h>
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 <stdio.h>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,我们只需要有一张地图(即数组的下标可以确定每一个数组单元)和一个起始点(即数组的首地址),然后按照起始点找到下一个帐篷,并把东西(数据)存放进帐篷即可)。
- 字符指针变量和字符数组的区别
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 <stdio.h>void main()
{
char *a = "I love UNSW!";
printf("%s\n", a);a += 7;
printf("%s\n", a);
}
//输出:UNSW!
3.2若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。见例6.
//例6
/#include <stdio.h>
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开始)