C语言—— 字符串与指针
1 字符串的表示形式
在C程序中,可以用两种方法访问一个字符串
(1)用字符数组存放一个字符串,然后输出该字符串。
(2)用字符指针指向一个字符串
2 字符指针作函数参数
将一个字符串从一个函数传递到另一个函数,可以用地址传递的方法,即用字符数组名作参数,也可以用指向字符的指针变量作参数。在被调用的函数中可以改变字符串的内容,在主调函数中可以得到改变了的字符串。
(1)用字符数组作参数
(2)形参用字符指针变量
3 对使用字符指针变量和字符数组的讨论
虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们两者之间是有区别的,不应混为一谈,主要有以下几点。
(1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址,决不是将字符串放到字符指针变量中。
(2)赋值方式。
(3)对字符指针变量赋初值。
(4)如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址,也就是说,该指针变量可以指向一个字符型数据,但如果未对它赋予一个地址值,则它并未具体指向一个确定的字符数据。
(5)指针变量的值是可以改变的。
(6) 用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。
例题1:指针实现,判断一个子字符串是否在某个给定的字符串中出现。
#include <stdio.h>
#include <string.h>
int isSubstring(char *str,char *substr)
char *ch,*s;
int flag ;
while(*str!='\0'){
if(*str == *substr)
s = str;
ch = substr;
while(*ch!='\0')
if(*s++ != *ch++ )
{ flag = 0; break;}
if(*ch=='\0')
flag = 1;
str++;
return flag;
int main()
{ char s[]="Hello world!";
char ch[10];
printf("输入要查找的字串:");
gets(ch);
if(isSubstring(s,ch))
printf("%s是%s一个子串\n",ch,s);
printf("%s不是%s一个子串\n",ch,s);
return 0;
}
例题2:定义一个函数将输入的字符串逆序存储并在主函数输出。要求使用指针变量作为函数形参。
#include <stdio.h>
#include <string.h>
void reverse1(char *ch, int len);
void reverse2(char *ch ,int len);
int main()
{ char s[30];
int len;
puts("输入字符串:\n");
gets(s);
len = strlen(s); //注意这里
reverse1(s,len);
printf("逆序存储后输出数据:\n");
puts(s);
reverse2(s,len);
printf("逆序存储后输出数据:\n");
puts(s);
return 0;
void reverse1(char *ch ,int len)
int i,j;
char c;
for(i=0,j=len-1;i<j;i++,j--)
c= ch[i];
ch[i] = ch[j];
ch[j] = c;
void reverse2(char *ch ,int len)
char *start,*end, c;
start = ch;
end = ch + len-1;
while(start<end)
c = *start; *start = *end; *end = c;
start++; end--;
例3 定义一个函数实现对两个字符串进行交叉连接。例如:有两个字符串abcd”、”1234”,交叉连接后结果为“a1b2c3d4“,并在主函数显示连接后字符串,要求字符指针作为函数形参。
第一种方法
#include <stdio.h>
void linkchar(char *c1,char *c2, char *c3)
while(*c1!='\0'|| *c2!='\0')
*c3++ = *c1;
*c3++ = *c2;
c1++;c2++;
*c3 = '\0';
int main()
char s1[20],s2[20],s3[20];
printf("输入字符串s1: ");
gets(s1);
printf("输入字符串s2: ");
gets(s2);
linkchar(s1,s2,s3);
printf("输出字符串:\n");
puts(s3);
return 0;
第二种方法:
#include <stdio.h>
#include <string.h>
char *strfun(char *s1 ,char *s2)
char *p ;
char t[20],*s;
s = s1;
while(*s!='\0'&& *s2!='\0')
{ p=++s;
strcpy(t,p);
*p = *s2++;
strcpy(p+1,t);
++s;
*s ='\0';
return s1;
int main()