【C语言补漏】 指针和数组

指针和数组的关系

抛出结论:虽然数组和指针关系密切,好基友,但是数组绝不是指针,他们只是哥俩好而已!

先看第一个例子

#include<stdio.h>

void main()
{
	int a;
	int *p = &a;
	printf("请输入一个整数:");
	scanf("%d", &a);

	printf("a = %d\n", a);

	printf("请重新输入一个整数:");
	scanf("%d", p);//这里的p就是整型变量a 地址,相当于&a
	printf("a = %d\n", a);

}

运行结果:

请输入一个整数:123
a = 123
请重新输入一个整数:321
a = 321
请按任意键继续. . .

再看下面的程序,和上面的进行比较。

#include<stdio.h>

void main()
{
	char str[128];//数组在定义时,必须初始化大小
	printf("请输入博客的地址:");
	scanf("%s", str);

	printf("我的博客的地址是:%s\n", str);
	
	printf("str 的地址是:%p\n", str);
	printf("str 的地址是:%p\n", &str[0]);

}

运行结果:

请输入博客的地址:https://blog.csdn.net/plSong_CSDN
我的博客的地址是:https://blog.csdn.net/plSong_CSDN
str 的地址是:0000002881D4FC80
str 的地址是:0000002881D4FC80
请按任意键继续. . .

比较上面的代码,可以说明:数组名,其实就是第一个元素的地址;

指向数组的指针

定义一个指针指向数组

char a[123];
char *p;
p = a;//语句1
p = &a[0];//语句2

上面语句1和语句2是相同的。

指针的运算

当指针指向数组元素的时候,我们可以对指针变量进行加减运算(n),这样做的意义相当于指向距离指针所在位置向前或向后地n个元素。

看下面的例子:

#include<stdio.h>

void main()
{
	int num[5] = {1,2,3,4,5};
	int *p = num;
	int i;
	printf("使用定义的数组指针:\n");
	for (i = 0; i <= 4; i++)
	{
		printf("num[%d]= %d\n", i,*(num + i));
	}

	printf("使用数组名:\n");
	for (i = 0; i <= 4; i++)
	{
		printf("num[%d]= %d\n", i, *(p + i));		
	}
}

运行结果:

使用定义的数组指针:
num[0]= 1
num[1]= 2
num[2]= 3
num[3]= 4
num[4]= 5
使用数组名:
num[0]= 1
num[1]= 2
num[2]= 3
num[3]= 4
num[4]= 5
请按任意键继续. . .

对比标准的下标法访问数组元素,这种使用指针进行间接访问的方法叫做指针法;

需要强调的是:

1)p+1并不是简单地将地址加1,而是指向数组的下一个元素。

2)由于数组名就是指针,所以,可以之间使用数组名进行访问。


鱼C论坛《带你学C带你飞》S1E22课后作业

https://fishc.com.cn/forum.php?mod=viewthread&tid=72205&extra=page%3D1%26filter%3Dtypeid%26typeid%3D570

检测题

0.str[3] 用指针法怎么表示?

答:*(str+3)

1. 假设整型指针变量 p 存放的地址值是 0x11008888,那么请问 p + 1,p + 2,p + 4 和 p + 8 的地址分别是?

p + 1 == 0x11008888 + 4 == 0x1100888C
p + 2 == 0x11008888 + 8 == 0x11008890
p + 4 == 0x11008888 + 16 == 0x11008898
p + 8 == 0x11008888 + 32 == 0x110088A8

2. 请问 str[20] 是否可以写成 20[str]?

答:居然可以,

因为在访问数组的元素的时候,数组名被解释为数组第一个元素的地址。

所以 str[20] == *(str + 20) == *(20 + str) == [20]str


★finished by songpl,2018.12.28

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值