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 強制轉換 指向(int), 本身的類型是 ( int * ) ** ptr + 5 : 編譯器處理為 ptr 的值加上 5 * sizeof(int) ** ptr 向高地址移動20個字節, 此時超出a 的合法范圍(a的聲明是以 char單位分配的 ), 但是語法可以 ** ***/ 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.兩個指針可以作減法操作,但必須類型相同
 
吐吐吐吐吐吐吐槽: 博客園好難用。。。。。。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM