指针运算:打印数组内容、模拟strlen函数(指针闯关3)

目录

0. 三种指针运算

1. 指针 +- 整数

2. 指针 - 指针

2.1 前提条件

2.2 strlen的模拟实现

3. 指针的关系运算(比较指针大小)

4. 打印数组内容的又一种方法 


0. 三种指针运算

指针的基本运算有三种,分别是:

• 指针 +- 整数

• 指针 - 指针

• 指针的关系运算(比较指针大小)

        这里可以用日期来对比指针,日期加减天数(整数)得到的还是日期,日期减日期得到的是天数,日期和日期可以比较大小。而日期加日期没有任何意义。

1. 指针 +- 整数

        因为数组在内存中是连续存放的,只要知道第一个元素的地址,顺藤摸瓜就能找到后面的所有元素。

aa026d613bb4436f86c1d90724bd8730.png

4c88285e8afe4ea19a48f3e437544804.png

#include <stdio.h>
int main()
 {
     int arr[10] = {1,2,3,4,5,6,7,8,9,10};
     int *p = &arr[0];
     int sz = sizeof(arr)/sizeof(arr[0]);
     for(int i = 0; i < sz; i++)
     {
         printf("%d ", *(p + i));//p+i 这⾥就是指针+整数
     }
     return 0;
 }

         上图中的代码便是通过 指针 +- 整数 打印数组内容。

2. 指针 - 指针

2.1 前提条件

7aa6da0153014da2b085e23633302dc5.png

计算 指针 - 指针 的前提条件一定是:两个指针指向了同一块空间!

14d5e1391c474b3084b72f0d9d456b25.png

        上图中,相减的两个指针分别指向了不同的空间,运行时编译器虽然没有报错,但给出了警告,而且这样计算没有意义。相减的两个指针指向同一块空间计算才有意义。

2.2 strlen的模拟实现

05ea9ebd91e94e3293765133a45250d7.png

#include <stdio.h>
size_t my_strlen(char* str)
{
	char* start = str;
	while (*str != '\0')
		str++;

	return str - start;//指针-指针
}
int main()
{
	//strlen用于求字符串长度,统计的是字符串中\0之前的字符个数
	char raojiang[] = "chi meng";
	//[c h i   m e n g \0]
	size_t len = my_strlen(raojiang);//raojiang = &raojiang[0]
	printf("%d\n", len);
	return 0;
}

         除了可以用上面 指针 - 指针 的方法模拟strlen函数,还可以用下面计数的方法。

#include <stdio.h>
size_t my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char raojiang[] = "chi meng";
	size_t len = my_strlen(raojiang);
	printf("%d\n", len);
	return 0;
}

3. 指针的关系运算(比较指针大小)

dabcc6017be146389b6bde4d2b43ce61.png

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;//&arr[0]
	while (p < arr + sz)//arr+sz 就是指针+整数,p < arr+sz 就是在比较指针大小
	{
		printf("%d ", *p);
		p++;
	}
	return 0;
}

         上图中的代码便是通过 指针的关系运算 打印数组内容。

4. 打印数组内容的又一种方法 

        说是又一种方法,也就是代码不一样,本质上还是同一种方法。 

8c60fcb0b7b34e2eb6a21a45856b9f66.png

#include <stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;//&arr[0]  数组名是数组首元素的地址
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (p = &arr[0]; p < &arr[sz]; p++)//p < &arr[sz] 就是比较指针大小,p++ 就是指针+1
	{
		printf("%d ", *p);
	}
	return 0;
}

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值