【C语言】

指针和一维数组

#include <stdio.h>

int main(int argc, const char *argv[])
{
   
	int s1[5] = {
   10, 20, 30, 40, 50};
	
	s1[0] = 1314;

	//数组名 就是数组的首地址
	//数组名[下标]  访问成员的本质
	//就是以数组首地址为基准 偏移 然后取 * 操作
	printf("s1[0] = %d,  *s1 = %d\n", s1[0], *s1);//1314 1314
	//也就是说 数组名这个地址 的操作空间是一个元素
	printf("s1[1] = %d, *(s1+1) = %d\n", s1[1], *(s1+1));//20 20
	//s1[i] <==> *(s1+i)
	
	//可以定义一个指针来保存数组的首地址
	//写法如下
	int *p1 = s1; //数组名 就是首地址 这种是最常用的写法
	int *p2 = &s1[0];//这种写法也可以
	
	int *p3 = &s1;//注意:这种用法 保存的地址的值是一样的 
					//但是&s1 相当于给指针升维了 操作空间就变了
					//后面讲数组指针时再讲原因  记住 不要对数组名取地址!!!
	//下面5个的 值 是一样的
	printf("s1 = %p\n", s1);
	printf("&s1[0] = %p\n", &s1[0]);
	printf("p1 = %p\n", p1);
	printf("p2 = %p\n", p2);
	printf("p3 = %p\n", p3);

	//指针指向数组后 就可以通过指针来操作数组的元素了
	*p1 = 520;
	*(p1+1) = 1314;
	p1[2] = 1234;

	//指针指向数组后 有如下的等价关系
	// s1[i] <==> *(s1+i) <==> p1[i] <==> *(p1+i)


	//一位数组的遍历
	int i = 0;
	for(i = 0; i < 5; i++){
   
		//printf("%d  ", s1[i]);
		//printf("%d  ", *(s1+i));
		//printf("%d  ", *(p1+i));
		printf("%d  ", p1[i]);
	}
	printf("\n");


	//指针指向数组后  p1 和 s1 的区别
	//p1 是指针  是变量  可以改变指向
	int s2[5] = {
   10, 20, 30, 40, 50};
	p1 = s2;
	//s1 是数组名 是地址常量 不能被赋值
	//s1 = s2;//错误的
	
	p1++;//正确的  指针的指向向后偏移 一个 int
	s1++;//错误的 s1 是常量

	return 0;
}

练习:

1.使用指针实现 strlen 函数的功能:

#include <stdio.h>

int main(int argc, const char *argv[])
{
   
	char s[128] = {
   0};
	gets(s);
	
	//定义一个指针 指向数组的首地址
	char *p = s;
	int count = 0;
#if 0
	while(s[count] != '\0'){
   
		count++;
	}
#endif

#if 0
	while(p[count] != '\0'){
   
		count++;
	}
#endif

#if 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值