1.指针减法
指针-指针得到是指针之间元素的个数。不是所有的指针都可以相减,指向同一块空间的指针才能相减。
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
printf("%d\n", &arr[9] - &arr[0]);
return 0;
}
//运行的结果是9
下面采用指针-指针的方法,编制一个类似获取字符串长度的strlen函数,my_strlen()。
#include <stdio.h>
int my_strlen(char* str)
{//字符串是以字符数组的形式存储在数组中的
//并且其数组的最后添加了结束符\0
char* start = str;
while (*str != '\0')
{
str++;
}
return (str - start);
}
int main()
{
int len = my_strlen("abcdef");
printf("%d\n", len);
return 0;
}
标准规定:允许指向数组元素的指针与指向数组元素最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一元素之前的那个内存位置的指针进行比较。也就是说这两个指针指向的是两个空间,而不是同一块空间。
2.指针与数组
数组:一组相同类型元素的集合。
指针变量:是一个变量,存放的地址。
1)通过指针来访问数组
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
//arr是首元素的地址
//&arr[0]
int* p = arr;
//通过指针来访问数组
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + 1));
}
return 0;
}
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
//arr是首元素的地址
//&arr[0]
int* p = arr;
//通过指针来访问数组
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%p------%p\n", &arr[i],p+i);
//p+i就是地址,对应&arr[i]
//p+1,就是跨过一个数组元素对应的字长。
}
return 0;
}
p+i就是地址,对应&arr[i],p+1,就是跨过一个数组元素对应的字长。
#include <stdio.h>
void test(int* p, int sz)
{ //使用指针的方法访问
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + 1));
}
}
int main()
{
int arr[10] = { 0 };
test(arr, 10);
return 0;
}
#include <stdio.h>
void test(int arr[], int sz)
{ //使用数组名的方法访问
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[10] = { 0 };
test(arr, 10);
return 0;
}
通过这个例子可以看出,数组名在一定程度上就是数组首元素的地址。