相关文章推荐
谦虚好学的香槟  ·  Sqlite3 ...·  1 年前    · 
刚分手的哑铃  ·  reactjs - Content not ...·  2 年前    · 
小胡子的大葱  ·  InputStream.Available ...·  2 年前    · 
潇洒的紫菜汤  ·  mysql bigint转string-掘金·  2 年前    · 
C语言—— 字符串与指针

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()