一、介绍
在C语言中,指针的运算分为三类
- 1、指针 + 整数 、指针 - 整数
- 2、指针 - 指针
- 3、指针的关系运算
二、指针 + 整数 、指针 - 整数
因为数组在内存中是连续存放的,只要知道第一个元素的地址,顺藤摸瓜就能找到后面的所有元素。
// 利用指针的整数运算,打印数组的每一个元素
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int * p =&arr[0];//将首地址交予了指针变量p
int i =0;
int sz = sizeof(arr)/sizeof(arr[0]);
for(i = 0; i < sz; i++)
{
printf("%d",*(p+i));//*(p+i)相当于首地址跳过了i*4 个字节,并指向了p+i 地址的内容
}
return 0;
}
// 在数组中的首地址就是arr[0]的地址
// 当p存储的是首地址时
// *(p+i) 相当于 arr[0+i] 它们是表示内容
// 而 p+i 则相当于 &arr[0+i] 它们是表示地址 甚至可以写成 &arr[0]+i ---> &arr[i]
// 利用指针的整数运算,打印出字符串
int main()
{
int arr = "abcdef";
char * p = &arr[0];
while(*p != '\0')
// abcdef 在数组中是 ['a','b','c','d','e','f','\0'] 二打印字符串并不需要\0
{
printf("%c",*p);
p = p+1;//进行地址的修改 使得*p所指向的内容转移到下一个地址中的内容
}
return 0;
}
二、指针 - 指针
指针-指针本质是地址减去地址。
而指针-指针的前提是:指针-指针(地址-地址]的前提是两个指针指向同一块空间的。
且指针-指针(地址-地址)得到的值的绝对值是指针和指针之间元素的个数。
int main()
{
int arr [10] = {0};
int ret = &arr[9] - &arr[0];
int ret1 = &arr[0] - &arr[9];
printf("%d\n",ret);
return 0;
}
// 得出的答案是 ret = 9 ret1 = -9
// 应用
// 利用指针 - 指针 求字符串的长度
int my_strlen(char* str)//传数组名,数组名也就是首元素地址
{
char* start = str;//将数组首地址交予一个新的指针变量
while (*str != '\0')//打印字符串不打印\0
{
str++;//指针内存储的地址不断地往下移动
}
return str - start;//使用最后\0前的指针变量减去首元素的指针变量
}
int mian()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d",len);
return 0;
}
四、指针的关系运算
指针的关系与运算,实质上就是指针比较大小,本质上是地址比较大小
// 应用
// 利用指针的大小关系,打印出数组中的所有元素
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;//arr表示的是首元素地址
int sz = sizeof(arr) / sizeof(arr[0]);
while (p < arr + sz)//指针的关系运用
{
printf("%d ",*p);
p++;
}
return 0;
}
// p<arr+sz表示的是 p所存储的地址要小于 数组的边界范围的地址
// 例如题中arr[10]是不存在的,而arr+sz相当于&arr[0] + 10 = &arr[10]