目录
0. 三种指针运算
指针的基本运算有三种,分别是:
• 指针 +- 整数
• 指针 - 指针
• 指针的关系运算(比较指针大小)
这里可以用日期来对比指针,日期加减天数(整数)得到的还是日期,日期减日期得到的是天数,日期和日期可以比较大小。而日期加日期没有任何意义。
1. 指针 +- 整数
因为数组在内存中是连续存放的,只要知道第一个元素的地址,顺藤摸瓜就能找到后面的所有元素。
#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 前提条件
计算 指针 - 指针 的前提条件一定是:两个指针指向了同一块空间!
上图中,相减的两个指针分别指向了不同的空间,运行时编译器虽然没有报错,但给出了警告,而且这样计算没有意义。相减的两个指针指向同一块空间计算才有意义。
2.2 strlen的模拟实现
#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. 指针的关系运算(比较指针大小)
#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. 打印数组内容的又一种方法
说是又一种方法,也就是代码不一样,本质上还是同一种方法。
#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;
}