C语言指针用法详解 指针的算术运算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言指针用法详解 指针的算术运算相关的知识,希望对你有一定的参考价值。

例题1:
  • Question : 
char a[20];
int *ptr = (int  * )a;
ptr++
  • Practice :
技术分享
  • Reason :
#include <bits/stdc++.h>
using namespace std;
int main()
{
    char a[20];
    int *ptr = (int  * )a;///  强制类型转换不会改变a的类型
    /***
    **   吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
    **   ptr 的类型是 int* , 指向的类型是 int , 指向整形变量 a
    ***/
    cout<<" befor : " << ptr<<endl;
    ptr++;
    cout<< " sizeof (ptr) "<< sizeof(ptr)<<endl;
    /***
    **   ptr 类型是指针,指针的自增,当然是增加自身的大小了
    **   sizeof(ptr)  为4, ptr 增加4
    ***/
    cout<<" after : "<<ptr<<endl;
}

  技术分享


例题2:
  • Question :    
   int arr[20] = {0};
    int *ptr = arr;
    for (int i=0; i<20; i++)
    {
          (*ptr)++;
           ptr++;
    }
  • Practice :
技术分享

 

  • Reason :
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int arr[20] = {0};
    int *ptr = arr;
    /***
    **   吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
    **   ptr 的类型是 int* , 指向的类型是 int , 指向 arr
    ***/
    for (int i=0; i<20; i++)
    {
        (*ptr)++; /// 改变的是 ptr 指向的值
        ptr++; /// 改变的是 ptr 指向的地址  ,再次验证 ptr  自增的是 sizeof(ptr)
        cout<<"  ptr  : "<<ptr<<endl;
    }
}

技术分享


例题3:

  • Question :    
  char a[20] ="You_are_a_girl;
    int *ptr = (int *)a;
    ptr += 5;
  • Practice:

技术分享

  • Reason
#include <bits/stdc++.h>
using namespace std;
int main()
{
    char a[20] = "You_are_a_girl";
    int *ptr = (int * )a;
    /***
    **   吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
    **   ptr 的类型是 int* , 指向的类型是 int , 指向 a
    ***/
    cout<<"  ptr  : "<<ptr<<endl;
    ptr += 5;
    /***
    **   ptr + 5 : 编译器处理为   ptr  的值加上 5 * sizeof(int)
    **   ptr 向高地址移动20个字节, 此时超出a 的合法范围, 但是语法可以
    **   我也不懂  这里为什么超出 a 的合法范围 ????求教
    ***/
    cout<<"  ptr  : "<<ptr<<endl;
}

  技术分享


例题4:

  • Question :    
 char a[20] = "You_are_a_girl";
    char *p = a;
    char **ptr = &p;
    printf("**ptr = %c \\n", **ptr);
    ptr++;
    printf("*ptr = %c \\n", **ptr);
  • Practice :

 

  • Reason
#include <bits/stdc++.h>
using namespace std;
int main()
{
    char a[20] = "You_are_a_girl";
    char *p = a;
    char **ptr = &p;
    /***
    **   吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
    **   p 的类型是 char* , 指向的类型是 char , 指向 a
    **   ptr 的类型是 char ** , 指向的类型是 char* , 指向 &p
    ***/
    printf("**ptr = %c \\n", **ptr);
    /*cout<<" *p "<<*p<<endl;
    cout<<" p "<<p<<endl;*/
    
    cout<<" ptr "<<ptr<<endl;
    ptr++;
    cout<<" ptr "<<ptr<<endl;
    cout<<" sizeof(char *) "<<sizeof(char *)<<endl;
    /// ptr自增 ,增加的是它指向的类型的 所占字节
    printf("*ptr = %c \\n", **ptr);
    /// 此时 *(ptr) 没人知道回事什么,也许是随机值,也许是非法操作
}

总结:
1. 一个指针ptrold 加或减一个整数n后,结果是一个新的指针ptrnew 
  • ptrold指针的类型 和 ptrnew指针的类型 相同
  • ptrold指针指向的类型 和 ptrnew指针指向的类型 相同
  • ptrold指针的指向(值)和 ptrnew指针的指向(值)相差为指向类型的字节数
2.两个指针不能作加法运算,非法操作
3.两个指针可以作减法操作,但必须类型相同
 
吐吐吐吐吐吐吐槽: 博客园好难用。。。。。。 

以上是关于C语言指针用法详解 指针的算术运算的主要内容,如果未能解决你的问题,请参考以下文章

C/C++语言指针用法详解 运算符 & 和 *

40篇学完C语言——(第七篇)地址算术运算

C语言指针的问题

C语言基础:指针相关概念(指针的算术运算 指针数组指向指针的指针 传递指针给函数 从函数返回指针 )为啥C 语言不支持在调用函数时返回局部变量的地址?

C语言指针小白一问

C 语言结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )