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

在这里插入图片描述

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

学习日记

目录

学习日记

前言​编辑

一、字符串的引用方式

例1

例2

二、字符指针作函数参数

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

例1

例2

例3

总结

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

 C语言指针操作


前言

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

一、字符串的引用方式

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

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

例1

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

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

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。用指针变量来处理。

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

二、字符指针作函数参数

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

例1

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

#include <stdio.h>
int main()
{	void copy_string(char from[], char to[]);
	char a[]="I am a teacher.";
	char b[]="You are a student.";
	printf("string a=%s\nstring b=%s\n",a,b);
	printf("copy string a to string b:\n");
	copy_string(a,b);		//用字符数组名作为函数实参
	printf("\nstring a=%s\nstring b=%s\n",a,b);
	return 0;
}

void copy_string(char from[], char to[])	//形参为字符数组 
{	int i=0;
	while(from[i]!='\0')
	{	to[i]=from[i]; i++;}
	to[i]='\0';
}

例2

        用字符型指针变量作实参

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

例3

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

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

总结

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

实参

形参

字符数组名

字符数组名

字符数组名

字符指针变量

字符指针变量

字符指针变量

字符指针变量

字符数组名

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

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

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

初始化的含义

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

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

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

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

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

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

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

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

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

        改变指针变量的值。 

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

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

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

 C语言指针操作

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

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

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

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

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

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

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

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

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉蕤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值