[C ++]素人の言語C ++ポインタ演算とポインタの安全性要約

ポインタ演算

ポインタ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
公開された239元の記事 ウォン称賛80 ビュー90000 +

おすすめ

転載: blog.csdn.net/qq_43827595/article/details/104344130