字符指针与字符串
1、学习目标
- 字符指针与字符串-掌握
- 总结与思考
2、字符指针与字符串
-
C语言通过使用字符数组来处理字符串
-
通常我们把char数据类型的指针变量称为字符指针变量。(数据类型 * 变量名)
-
字符指针变量与字符数组有着密切关系,它也被用来处理字符串。
-
初始化字符指针是把内存中字符串的首地址赋予指针,并不是把该字符串复制到指针中。
-
char str[] = “Hello World”;//字符数组中字符串内容是可变的
-
char * p = str;
-
示例验证:
#include <stdio.h> int main() { char ch = 'A';//字符型的变量 char * p; p = &ch;//指针指向字符 printf("%c %c\n", ch, *p);//通过指针找指针的目标是*p return 0; }
运行结果:关于字符指针最基本的程序
$ ./app A A
字符数组存储字符串//char str[] = “Hello World”;
#include <stdio.h> int main() { char ch1[] = "Hello World!"; char ch2[] = "Hello World!"; char * p; p = ch1;//相当于ch1[0]<=> *(ch1+0) <=> p[0] printf("%s\n", p); p = ch2; printf("%s\n", p); return 0; }
运行结果:
./app Hello World! Hello World!
修改上面的程序,理解指针操作字符串,判断字符串中第一个字母,由大写转小写,由小写转大写。
#include <stdio.h> #include <ctype.h> int main() { char ch1[] = "Hello World!"; char ch2[] = "Hello World!"; char * p; p = ch1; if(isalpha(*p)){ if(isupper(*p)) *p = tolower(*p); else *p = toupper(*p); } printf("%s %p\n", p, p); p = ch2; printf("%s %p\n", p, p); return 0; }
运行结果:虽然内容相同,但是放在内存不同的位置
$ ./app hello World! 0x7ffc4ec63060 Hello World! 0x7ffc4ec63070
-
-
在C语言编程中,当一个字符指针指向一个字符串常量时,不能修改指针指向的对象的值。
-
char * p = “Hello World”;//Hello World是字符串常量,不能修改的
//指针存储了字符串常量的首地址,不能通过指针来修改代码
-
*p = ‘h’;//错误,字符串常量不能修改
-
示例验证:
C语言中关于变量的处理,全局变量、static修饰的变量、字符串常量这三种情况下是放到静态区的,程序结束后才会释放内存。
#include <stdio.h> int main() { char * p1 = "Hello World!";//字符串存放在静态区 char * p2 = "Hello World!"; printf("&p1=%p %p %s\n", &p1, p1, p1); printf("&p2=%p %p %s\n", &p2, p2, p2); return 0; }
运行结果:指针p1,p2都指向字符串常量"Hello World!",存储位置为静态区,不能通过指针进行修改。
$ ./app &p1=0x7fffa948f9d8 0x4006a4 Hello World! &p2=0x7fffa948f9e0 0x4006a4 Hello World!
验证:*p = ‘h’;//错误,字符串常量不能修改
#include <stdio.h> int main() { char * p1 = "Hello World!"; char * p2 = "Hello World!"; * p1 -= 32; printf("&p1=%p %p %s\n", &p1, p1, p1); printf("&p2=%p %p %s\n", &p2, p2, p2); return 0; }
运行结果:
./app 段错误 (核心已转储)
用strcpy()函数验证字符串常量不能修改。
#include <stdio.h> #include <string.h> int main() { char ch[] = "welcome"; char * p1 = "Hello World!"; //strcpy(ch, p1);(1) strcpy(p1, ch);//(2)同样是修改字符串常量 puts(ch); puts(p1); return 0; }
运行结果:
//(1)strcpy(ch, p1); $ ./app Hello World! Hello World!
//(2)strcpy(p1, ch); $ ./app 段错误 (核心已转储)
-
3、程序举例
-
不利用任何字符串函数,编程实现字符串连接函数的功能。
#include <stdio.h> int main() { char ch[100] = "welcome"; char * p = "Hello World!", *q; int i = 0; q = p; while(*(ch+i) != '\0') i++; while(*p != '\0'){ *(ch+i) = *p; i++; p++; } *(ch+i) = *p;//让指针p中的\0赋给ch[]中 p = q; puts(ch); puts(p); return 0; }
运行结果:
$ ./app welcomeHello World! Hello World!
4、总结与思考
-
主要介绍了如何用字符指针操作字符串以及字符串常量相关内容。
-
思考:
-
字符指针操作字符串有什么注意事项?
如果是字符串常量,不能修改;不是字符串常量则可以修改。
-