指標的運算

2021-10-07 09:07:13 字數 3204 閱讀 2516

#include

#include

#include

using

namespace std;

intmain()

;char

*p=a;

printf

("p=%p\n"

,p);

printf

("p+1=%p\n"

,p+1);

int b=

;int

*q=b;

printf

("q=%p\n"

,q);

printf

("q+1=%p\n"

,q+1);

return0;

}

執行結果

char佔乙個位元組,所以p到p+1位址移動一位

int佔四個位元組,所以p到p+1位址移動四位

p到p+1移動的是乙個p指向的sizeof(「p指向的型別」)

#include

#include

#include

using

namespace std;

intmain()

;char

*p=&a[0]

;char

*p1=

&a[5];

printf

("p=%p\n"

,p);

printf

("p1=%p\n"

,p1)

;printf

("p1-p=%d\n"

,p1-p)

;int b=

;int

*q=b;

int*q1=

&b[6];

printf

("q=%p\n"

,q);

printf

("q1=%p\n"

,q1)

;printf

("q1-q=%d\n"

,q1-q)

;return0;

}

執行結果:

根據q1和q位址16進製制下位址的值做相減,可得10進製下24,但最後輸出的是6

實際上指標位址相減後還會除以sizeof(「指向型別」)

指標運算優先順序比「+」高,所以要用*(p+1)

但是指標的運算優先順序比「++」小

**示例:

可以發現,指標已經向後移動了乙個sizeof(),「++」運算比指標高

之所以元素值還是第乙個元素是因為「++」在p的後面,它要執行完了再++

如下就是先++

#include

#include

#include

using

namespace std;

intmain()

;int

*p; p=

&a[0];

printf

("address p=%p\n"

,p);

printf

("p[0]=%d\n",*

++p)

;printf

("address p=%p\n"

,p);

/* int b=;

int *q=b;

int *q1=&b[6];

printf("q=%p\n",q);

printf("q1=%p\n",q1);

printf("q1-q=%d\n",q1-q);

*/return0;

}

執行結果:

如果是「+」,那指標的運算優先順序更高,如下

#include

#include

#include

using

namespace std;

intmain()

;int

*p; p=

&a[0];

printf

("address p=%p\n"

,p);

printf

("p[0]=%d\n"

,*p+1)

;// *先運算

如上就是*先運算,先取出值再+1

指標的運算

指標運算 指標演算法並不依賴於指標的型別,如果p是乙個指向char的指標,那麼p 1就指向下乙個char 算術運算 指標的算數運算只限於兩種形式 指標運算只有用於陣列中其結果才是可以 的,對於任何並非指向陣列元素的指標執行算數運算其結果是非法的 1.指標 整數 結果也是指標 這種形式只能用於指向陣列...

指標的運算

指標的運算包括 1 指標的加法 2 指標的減法 char short int long long long float double 位元組數 1 2 2 4 4 8 4 8 int不加說明為4個位元組 對指標的加法而言 指標是不能加指標的 它只能加乙個數字 比如 指標 1 加乙個單元格 需要調整 ...

指標的運算

include int main int p arr p 10 p p 20 printf d,08x n arr 0 arr 1 return 0 指標 1的含義,首先思考一下指標 1可能的幾個含義 1 加整個陣列 這種含義不太符合實際,題中要的是遍歷陣列中的數。如果是加整個陣列,那就是直接跳過去...