3.指针与数组2

上一章着重讲解了指针与多维数组,这一章要从字符数组下手

我们要做的就是来引用字符数组中的字符串,我们知道%s格式声明可以做到,数组名加下标的组合也可以做到

简单来看一个例子:

#include<stdio.h>
int main(void) {
	char string[] = "i love you";
	printf("%s\n", string);
	printf("%c\n", string[7]);

	return 0;
}

输出结果:

 上面的例子中只运用了字符数组,接下来字符指针出场:

#include<stdio.h>
int main(void) {
	char* p = "i love you";
	printf("%s\n", p);

	return 0;
}

很简单对吧,结果:

继续:

#include<stdio.h>
int main(void) {
	char* p = "i love you";
	printf("%s\n", p);
	p = "i am a boy";
	printf("%s", p);
	return 0;
}

 在第一次输出完成后再次赋值,结果:

 好,继续,这里要求用地址法把字符串a复制给b,然后输出b数组:

#include<stdio.h>
int main(void) {
	char a[] = "i love you", b[20];
	int i;
	for (i = 0; *(a + i) != '\0'; i++) {
		*(b + i) = *(a + i);
	}
	*(b + i) = '\0';//最后到循环无法进行时,也就是a到头了,这时b也要在后面表示结束,所以打上'\0'
	printf("string a is:%s\n", a);
	printf("string b is:");
	for (i = 0; b[i] != '\0'; i++) {
		printf("%c", b[i]);
	}
	printf("\n");

	return 0;
}

当然也可以这样:

#include<stdio.h>
int main(void) {
	char a[] = "i love you", b[20];
	int i;
	for (i = 0; *(a + i) != '\0'; i++) {
		*(b + i) = *(a + i);
	}
	*(b + i) = '\0';
	printf("string a is:%s\n", a);
	printf("string b is:%s\n",b);

	return 0;
}

结果都会是:

这个就不做过多解释了

接下来还是这个问题,要引入字符指针来解决

我们先构思一下,嗯,现在需要两个指针分别指向两个字符数组,然后采用同样的方法,把a赋给b

代码如下:

#include<stdio.h>
int main(void) {
	char a[] = "i like eating", b[20];
	char* p1, * p2;
	p1 = a;
	p2 = b;
	for (; *p1 != '\0'; p1++, p2++) {
		*p2 = *p1;
	}
	*p2 = '\0';
	printf("string a is:%s\n", a);
	printf("string b is:%s", b);
	return 0;
}

 结果:

 如果你打出这个:

 你得反思自己哪里打错了,是不是少加了*之类的错误,导致溢出了

好,接下来我们再加上函数:

还是复制数组的操作,定义一个函数用来调用实现

#include<stdio.h>
void copy(char from[], char to[]);//声明函数
int main(void) {
	char a[] = "i am a boy";
	char b[] = "she is a girl";
	printf("a=%s,b=%s\n", a, b);//打印出来一下原始数组
	copy(a, b);//函数引用
	printf("a=%s,b=%s", a, b);

	return 0;
}
void copy(char from[], char to[]) {
	int i=0;
	while (from[i] != '\0') {
		to[i] = from[i];
		i++;
	}
	to[i] = '\0';//还是要给最后那个弄成结束符,不要忘记
}

这里把b变成了a的复制,结果:

 还是一样,我们再加入指针,只需要修改主函数就可以了:

#include<stdio.h>
void copy(char from[], char to[]);//声明函数
int main(void) {
	char a[] = "i am a boy";
	char b[] = "she is a girl";
	char* p1, * p2;
	printf("a=%s,b=%s\n", a, b);//打印出来一下原始数组
	p1 = a; p2 = b;
	copy(p1, p2);//函数引用
	printf("a=%s,b=%s", a, b);

	return 0;
}

前面的例子是字符数组做的函数形参,也就是void copy(char from[], char to[]),这里面是数组,下面把它改成指针:

#include<stdio.h>
void copy(char from[], char to[]);//声明函数
int main(void) {
	char *a = "i am a boy";
	char b[] = "i am a girl";
	char* p;
	printf("a=%s,b=%s\n", a, b);//打印出来一下原始数组
	p = b;
	copy(a, p);//函数引用
	printf("a=%s,b=%s", a, b);

	return 0;
}
void copy(char *from, char *to) {
	for (; *from != '\0'; from++, to++) {
		*to = *from;
	}
	*to = '\0';//还是要给最后那个弄成结束符,不要忘记
}

这里还有几点疑问,那就是,直接*b然后函数中代b会报错,我这里还在研究,等想通了会补上的,(是我太菜了)。

好,这一章先讲这些,全部是字符指针与字符数组,可能有些啰嗦,全当加强记忆。如有疏漏,还请指正,谢谢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值