C语言—指针运算

目录

一 指针 +- 整数

 二 指针 - 指针

 三 指针的关系运算


一 指针 +- 整数
 

int main()
{
       int arr[10] = { 0 };
       //不使用下标访问数组
       int* p = &arr[0];
       int i = 0;
       int sz = sizeof(arr) / sizeof(arr[0]);
       for (i = 0; i < sz; i++)
       {
              *p = i;
              p++;//p = p+1
       }
       p = arr;//回到初始位置
       for (i = 0; i < sz; i++)
       {
              printf("%d ", *(p + i));//p+i
       }

       /*for (i = 0; i < sz; i++)
       {
              printf("%d ", arr[i]);
       }*/

       return 0;
}

 

 
需要注意的是 
int arr[10];
int * p = arr;
*(p+i) == arr[i];
*(arr+i) == arr[i]
实际上计算机在计算arr[i]的时候是转换为*(arr+i)计算的 arr为首元素地址
  
  
arr[i] == *(arr+i) == *(i+arr) == i[arr]

 

 arr[i] --> i[arr]
  [ ] 只是个操作符  i 和 arr 才是操作数

 二 指针 - 指针

int main()
{
       int arr[10] = { 0 };
       printf("%d\n", &arr[9] - &arr[0]);//?
       printf("%d\n", &arr[0] - &arr[9]);//?

       return 0;
}

//指针 - 指针得到的数值的绝对值 是指针和指针之间的元素个数

 

 

 

int main()
{
       int arr[10] = { 0 };
       char ch[5] = {0};
       //指针和指针相减的前提是:两个指针指向了同一块空间
       printf("%d\n", &ch[4] - &arr[0]);//err 错误代码

       return 0;

 

 

//求字符串长度
//方法1
int my_strlen(char* s)
{
       int count = 0;
       while (*s != '\0')
       {
              count++;
              s++;
       }
       return count;
}

int main()
{
       char arr[10] = "abcdef";
       int len = my_strlen(arr);
       printf("%d\n", len);
       return 0;
}

//方法二
int my_strlen(char* s)
{
       char* start = s;// 首元素地址放进 start
       while (*s != '\0')
       {
              s++;
       }
       return s - start;//指针 - 指针
}
int main()
{
       char arr[10] = "abcdef";
       int len = my_strlen(arr);
       printf("%d\n", len);
       return 0;
}

 三 指针的关系运算

//地址是有大小的
//指针的关系运算就是比较指针的大小

#define N_VALUES 5
int main()
{
    float values[N_VALUES];
    float* vp;
    for (vp = &values[N_VALUES]; vp > &values[0];)//比较指针大小
    {
        *--vp = 0;//先--
    }
}

//简化代码

for(vp = &values[N_VALUES-1]; vp >= &values[0]; vp--) 
{  
  *vp = 0;
 }
//实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证 它可行。
//标准规定 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许 与指向第一个元素之前的那个内存位置的指针进行比较

感觉指针运算还是很容易理解的 最近太忙了没有太多时间发博客 

继续加油!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值