ポインタ演算
ポインタpは整数nが、この操作の意義及び正常ポインタ値プラスまたはマイナス、プラスまたはマイナスであってもよい
、例えばp型ポインティングINT整数として、単位に基づいている、同じではないセンス動作1つの単位は、sizeof(int)
(1)実施例1
char a[20]="You are my friend";
int *ptr=(int *)a;
ptr = ptr + 3;
各単位は、バイト文字列であり、PTRポインタ部によって指し示さ4バイトである
。それは、アレイに追加していない第1の前PTR 3 - (全体として)4バイト、3を追加、PTRは、点13のアレイ有し- 16バイト、すなわち、指向a[12] - a[15]这部分
(2)実施例2
#include <iostream>
using namespace std;
int main() {
int array[20] = {0};
int *ptr = array; // 数组名array是地址,把它赋给指针ptr
for(int i = 0; i < 20; i++) {
*ptr = i;
ptr++;
}
ptr = array;
for (int i = 0; i < 16; i += 4) {
cout << *(ptr + 4) << endl;
// 等价于cout << ptr[4] << endl;
ptr += 4;
// 因为ptr指向的是int,而数组array也是int
// 所以指针ptr+4,等于下标i+4
}
return 0;
}
要約
ポインタ(アドレス)ptroldを整数N、結果は新しいポインタ(アドレス)が加算(減算)した後ptrnew、
ptrnewタイプのptrold同じタイプ、ptrnew点と型ptroldのタイプ点も同じです
sizeofによってNの増加(減少)(タイプptroldが指摘)バイトの値よりPtrnew ptrold値
即ち:メモリ領域によって指さよりもメモリ領域をptrold ptrnew点N移動はsizeof(タイプ尖ったptrold)高い(低い)方向アドレスバイト。
ポインタとポインタの減算:
- 二つのポインタは、それが不正な操作で、追加されていない
添加後、結果は不明な点まで得られていない、と何の意味です。 - 二つのポインタを減算することができる
コースのsizeofで割っ覚えではなく、配列のサイズを得るために使用することができ、同じタイプ(タイプ)
配列とポインタの関係*(p + 4)およびp [4]
配列名配列は、本質的にポインタであり、
int array[]={0,1,2,3,4,5,6};
int *p = array;
ことを思い出してください
(*は P + 4 )、及びP [ 4は]と等価です
*(配列+。4 )とArray [ 4は]と等価です
とarray[0]
に相当しp[0]
、P =配列以来、;
だから、実際には、上記の4つに相当します
そして(* P).DATA;構造体とポインタP->データの関係
struct node {
int data;
int time;
}node;
node Tu;
node *p = &Tu;
ただ覚えている:(* P-を。)データとP-は- >データ;と等価です
ポインタのセキュリティ問題
(1)実施例1
int a;
int *p = &a;
p += 1;
*p = 8;
上記のコードは、重大なエラーが存在する三行目以降のp += 1
上位アドレス方向に隣接する整数の変数記憶領域に実行、P点の後に、この領域における線に我々実際の書き込みデータ第、我々はそれが元のコンテンツ内にあるかわからないので、非常に危険である、システムがデータの場合には非常に重要です
[10]同様に操作可能INTアレイ、それは我々が空間10の連続した長さのために適用しているため、この空間は知られており、我々は自由に書き込みデータを缶であります
ポインタを使用するときに、我々は非常に明確でなければならない:正確にこのポインタがポイント
(2)実施例2
sizeofよりも私たちは、ポインタのキャストP1 =(タイプ*)P2を使用し、場合はsizeof(P2タイプ)大きい(PTR1タイプ)あなたは安全であるためにストレージ領域P2のアクセスポイントにポインタP1を使用する場合。それ以外の場合は深刻な問題があるでしょう
char t = 'a';
int *p;
p = (int *)&t;
*p = 520;
エラーではないかもしれないコードを実行しますが、セキュリティ上のリスクがあるのp点のために文字に、a
そして3つのバイトとそれに隣接する上位アドレス、および我々が遅れているのか分からないという内容の3バイト、場合には、それは非常に重要です
(3)次のコードでは、安全であり、私のマシンは、リトルエンディアンモードで説明することができます
最後の値t 48ので、我々は、pバイトint4の低いバイト強制的に変換されたchar型のポインタpがデフォルトへのポインタでポイントが低いバイトアドレスINT4バイト、それが可能であることがわかります説明私のマシンは、リトルエンディアン(下位アドレスの下位バイト)であります
int t = 7;
char *p;
p = (char *)&t;
*p = '0'; // 对应48:00110000 char 一个字节:0-127
cout << *p << endl;
cout << t << endl; // 输出48