C语言--指针与字符串的关系

人之所以痛苦,那是因为你在成长。--------magic_guo

在内存中,字符串是以数组的形式存储的,在C程序中,字符串是存放在字符数组中的,因此知道了数组与指针的关系,就可以更加了解指针与字符串的关系。
1.在C语言中对于字符串引用方式:
①通过数组名引用字符串

# include<stdio.h>


// 通过数组名引用字符串
int main(void)
{
	char string[] = "I love China!";
	printf("%s\n", string);
	printf("%c\n", string[7]);

	return 0;
}

// %s可以对一个字符串进行整体的输入输出

/* 通过字符数组名或字符指针变量可以输出一个字符串,
而对于一个数值型数组,是不能企图用数组名输出它的全部元素的,对数值型数组的元素只能逐个输入或者输出 */

②通过指针变量引用字符串

int main(void)
{
	char * string;
	string = "I love China!";
	printf("%s\n", string);


	return 0;
}

// 通过指针变量引用字符串常量和通过数组名引用字符串常量的区别
// 初始化:
//	char * string = "I love China!";等价于
	// char * string;
	// string = "I love China!";

// 使用数组名
// string[] = "I love China!";
// 并不等价于
	// char string[];
	// string = "I love China!";
	// 数组可以在定义时对各个元素进行赋初值,但是不能用赋值语句对字符数组中的全部元素整体赋值。

例题:

# include<stdio.h>

// 将字符串a复制到字符串b,然后输出字符串b

// 普通方法
int main(void)
{
	char a[] = "I am a student!", b[20];
	int i;
	for (i=0; a[i]!='\0'; i++)
	{
		b[i] = a[i];
	}
	b[i] = '\0';
	printf("a = %s\n", a);
	printf("b = %s\n", b);
	return 0;
}


// 普通方法嵌入指针表示
int main(void)
{
	char a[] = "I am a student!", b[20];
	int i;
	for (i=0; *(a+i)!='\0'; i++)
		*(b+i) = *(a+i);
	b[i] = '\0';
	printf("a = %s\n", a);
	printf("b = %s\n", b);	

	return 0;
}

// 使用指针变量
int main(void)
{
	char a[] = "I am a student!", b[20], *p, *q;
	p = a, q = b;
	for (; *p!='\0'; p++,q++)
		*q = *p;
	*q = '\0';
	printf("a = %s\n", a);
	printf("b = %s\n", b);	

	return 0;
}

2.字符指针作函数参数
①使用字符数组名做函数的形参和实参

# include<stdio.h>

// 定义一个copy_string函数来实现字符串复制的功能
// 使用字符数组名做函数的形参和实参

int main(void)
{
	void copy_string(char from[], char to[]);
	char a[] = "I am a teacher!";
	char b[] = "You are a farmer!";
	printf("string a=%s\nstring b=%s\n", a, b);
	printf("copy string a to string b:\n");
	copy_string(a, b);
	printf("string 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';
}

//可将copy_string函数的循环体改成:
//while (from[i]!='\0') 因为计算机内部是使用ASCII码进行运算的,'\0'的ASCII码对应的是0.

②使用字符指针变量作为函数的形参和实参

# include<stdio.h>

// 使用字符指针变量作为函数的形参和实参

int main(void)
{
	void copy_string(char * from, char * to);
	char a[] = "I am a teacher!";
	char b[] = "You are a farmer!";
	char * p, *q;
	p = a, q = b;
	printf("string a=%s\nstring b=%s\n", a, b);
	printf("copy string a to string b:\n");
	copy_string(p, q);
	printf("string a=%s\nstring b=%s\n", a, b);

	return 0;
}

void copy_string(char * from, char * to)
{
	while ((*to=*from)!='\0')
	{
		to++, from++;
	}
}

3.字符变量与字符数组的比较
①字符数组由若干个元素组成,每个元素中存放一个字符,而字符指针变量中存放的是地址(字符串中第一个字符的地址),绝不是将整个字符串放到字符指针变量中。
②赋值方式不同:可以对字符指针变量赋值,但不能够对数组名赋值
原因:数组名虽然代表地址,但他是常量,常量的值是不能改变的;但是数组可以在定义时对各元素赋初值。
③字符数组中各元素的值是可以改变的,但字符指针变量指向的字符串常量中的内容是不可以被取代的。
例子:

# include<stdio.h>

int main(void)
{
	char a[] = "I am a teacher!";
	char * b = "You are a farmer!";
	a[2] = 'l';						// 合法,l取代a数组元素a[2]的原值a
	b[2] = 'l';						// 不合法,字符串常量是不能被改变的

	return 0;
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值