例題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.兩個指針可以作減法操作,但必須類型相同
吐吐吐吐吐吐吐槽: 博客園好難用。。。。。。