• C语言指针操作(四)通过指针引用字符串


    在这里插入图片描述

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。 

    学习日记

    目录

    学习日记

    前言​编辑

    一、字符串的引用方式

    例1

    例2

    二、字符指针作函数参数

    用函数调用实现字符串的复制。

    例1

    例2

    例3

    总结

    三、使用字符指针变量和字符数组的比较 

     C语言指针操作


    前言

            指针这里分为八个小部分,分别是“指针变量”、“通过指针引用数组”、“*通过指针引用多维数组”、“通过指针引用字符串”、“*指向函数的指针”、“*返回指针值的函数”、“*指针数组和多重指针”、“*动态内存分配与指向它的指针变量” 。 

    一、字符串的引用方式

             用字符数组存放一个字符串,可以通过数组名和下标引用字符串中一个字符,也可以通过数组名和格式声明“%s”输出该字符串。

            用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。

    例1

            定义一个字符数组,在其中存放字符串″I love China!″,输出该字符串和第8个字符。 

    1. #include <stdio.h>
    2. int main()
    3. { char string[]="I love China!"; //定义字符数组sting
    4. printf("%s\n",string); //用%s格式声明输出string,可以输出整个字符串
    5. printf("%c\n",string[7]); //用%c格式输出一个字符数组元素
    6. return 0;
    7. }

    string

    I

    string[0]

    string[1]

    l

    string[2]

    o

    string[3]

    v

    string[4]

    e

    string[5]

    string[6]

    string(7)

    C

    string[7]

    h

    string[8]

    i

    string[9]

    n

    string[10]

    a

    string[11]

    !

    string[12]

    \0

    string[13]

            在C语言中只有字符变量,没有字符串变量。string被定义为一个指针变量,基类型为字符型。它只能指向一个字符类型数据,而不能同时指向多个字符数据。

            可以通过字符指针变量输出它所指向的字符串

    printf(″%s\n″,string);	//%s可对字符串进行整体的输入输出
    

            %s是输出字符串时所用的格式符,在输出项中给出字符指针变量名string,则系统会输出string所指向的字符串第1个字符,然后自动使string加1,使之指向下一个字符,再输出该字符……如此直到遇到字符串结束标志′\0′为止。

            注意,在内存中,字符串的最后被自动加了一个′\0′。 

    对字符串中字符的存取,可以用下标方法,也可以用指针方法。 

    例2

            将字符串a复制为字符串b,然后输出字符串b。用指针变量来处理。

    1. #include <stdio.h>
    2. int main()
    3. { char a[]="I am a boy.",b[20],*p1,*p2;
    4. p1=a;p2=b;
    5. //p1,p2分别指向a数组和b数组中的第一个元素
    6. for(;*p1!='\0';p1++,p2++) //p1,p2每次自加1
    7. *p2=*p1;
    8. //将p1所指向的元素的值赋给p2所指向的元素
    9. *p2='\0'; //在复制完全部有效字符后加'\0'
    10. printf("string a is:%s\n",a); //输出a数组中的字符
    11. printf("string b is:%s\n",b); //输出b数组中的字符
    12. return 0;
    13. }

    二、字符指针作函数参数

    用函数调用实现字符串的复制。

    例1

            用字符数组名作为函数参数

    1. #include <stdio.h>
    2. int main()
    3. { void copy_string(char from[], char to[]);
    4. char a[]="I am a teacher.";
    5. char b[]="You are a student.";
    6. printf("string a=%s\nstring b=%s\n",a,b);
    7. printf("copy string a to string b:\n");
    8. copy_string(a,b); //用字符数组名作为函数实参
    9. printf("\nstring a=%s\nstring b=%s\n",a,b);
    10. return 0;
    11. }
    12. void copy_string(char from[], char to[]) //形参为字符数组
    13. { int i=0;
    14. while(from[i]!='\0')
    15. { to[i]=from[i]; i++;}
    16. to[i]='\0';
    17. }

    例2

            用字符型指针变量作实参

    1. #include <stdio.h>
    2. int main()
    3. { void copy_string(char from[], char to[]); //函数声明
    4. char a[]="I am a teacher."; //定义字符数组a并初始化
    5. char b[]="You are a student."; //定义字符数组b并初始化
    6. char *from=a,*to=b; //from指向a数组首元素,to指向b数组首元素
    7. printf("string a=%s\nstring b=%s\n",a,b);
    8. printf("copy string a to string b:\n");
    9. copy_string(from,to); //实参为字符指针变量
    10. printf("\nstring a=%s\nstring b=%s\n",a,b);
    11. return 0;
    12. }
    13. void copy_string(char from[], char to[]) //形参为字符数组
    14. { int i=0;
    15. while(from[i]!='\0')
    16. { to[i]=from[i]; i++;}
    17. to[i]='\0';
    18. }

    例3

            用字符指针变量作形参和实参

    1. #include <stdio.h>
    2. int main()
    3. { void copy_string(char *from, char *to);
    4. char *a="I am a teacher."; //a是char*型指针变量
    5. char b[]="You are a student."; //b是字符数组
    6. char *p=b; //使指针变量p指向b数组首元素
    7. printf("string a=%s\nstring b=%s\n",a,b); //输出a串和b串
    8. printf("copy string a to string b:\n");
    9. copy_string(a,p); //调用copy_string函数,实参为指针变量
    10. printf("\nstring a=%s\nstring b=%s\n",a,b); //输出改变后的a串和b串
    11. return 0;
    12. }
    13. void copy_string(char *from, char *to) //定义函数,形参为字符指针变量
    14. { for(;*from!='\0';from++,to++)
    15. { *to=*from;}
    16. *to='\0';
    17. }

    总结

            字符指针作为函数参数时,实参与形参的类型有以下几种对应关系:

    实参

    形参

    字符数组名

    字符数组名

    字符数组名

    字符指针变量

    字符指针变量

    字符指针变量

    字符指针变量

    字符数组名

    三、使用字符指针变量和字符数组的比较 

            字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),绝不是将字符串放到字符指针变量中。

            赋值方式:可以对字符指针变量赋值,但不能对数组名赋值。(数组名是常量) 

    初始化的含义

    char *a="I love China!";======char *a;     a=″I love China!″; 

            存储单元的内容。编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元(Visual C++为指针变量分配4个字节)。 

    1. char *a,str[10];
    2. a=str; scanf("%s",a);

            指针变量的值是可以改变的,而字符数组名代表一个固定的值(数组首元素的地址),不能改变。 

            字符数组中各元素的值是可以改变的(可以对它们再赋值),但字符指针变量指向的字符串常量中的内容是不可以被取代的(不能对它们再赋值)。

    1. char a[]="House";
    2. a[2]='r';

            引用数组元素。对字符数组可以用下标法(用数组名和下标)引用一个数组元素(如a[5]),也可以用地址法(如*(a+5))引用数组元素a[5]。如果定义了字符指针变量p,并使它指向数组a的首元素,则可以用指针变量带下标的形式引用数组元素(如p[5]),同样,可以用地址法(如*(p+5))引用数组元素a[5]。 

            用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。

    1. char *format="a=%d,b=%f\n";
    2. printf(format,a,b);

            改变指针变量的值。 

    1. #include <stdio.h>
    2. int main()
    3. { char *a="I love China!";
    4. a=a+7; //改变指针变量的值,即改变指针变量的指向
    5. printf("%s\n",a); //输出从a指向的字符开始的字符串
    6. return 0;
    7. }

            指针变量的值是可以改变的,而字符数组名代表一个固定的值(数组首元素的地址),不能改变。

            指针变量a的值是可以变化的。printf函数输出字符串时,从指针变量a当时所指向的元素开始,逐个输出各个字符,直到遇'\0'为止。而数组名虽然代表地址,但它是常量,它的值是不能改变的。 

     C语言指针操作

    C语言指针操作(一)指针变量

    C语言指针操作(二)通过指针引用数组

    C语言指针操作(三)*通过指针引用多维数组 

    C语言指针操作(四)通过指针引用字符串

    C语言指针操作(五)*指向函数的指针

    C语言指针操作(六)*返回指针值的函数 

    C语言指针操作(七)*指针数组和多重指针 

    C语言指针操作(八)*动态内存分配与指向它的指针变量 

  • 相关阅读:
    mybatis-plus使用总结
    C#中密封类和密封方法
    Yolo-FastestV2:更快更轻
    数据转换成json格式
    ping包总结
    入门力扣自学笔记122 C++ (题目编号768)
    决策树算法
    【VUE异常】el-popconfirm失效,@confirm事件不生效,点击没有任何反应,刷新页面才能点击
    cx3588 文档说明
    【数组】最大相等频率
  • 原文地址:https://blog.csdn.net/m0_63794226/article/details/126566153