1.ポインタ有用性
リスト
2.ポインタが定義され
2.1。基本概念
ポインタ変数やポインタをポイントする変数は、その値がメモリアドレス空間内に格納されています。
もちろん、ポインタはポインタかもしれません。
2.2コードの実装
int i = 3;
int *p = &i;
int **q = &p;
cout<<p<<" "<<*p<<endl;
cout<<q<<" "<<*q<<" "<<**q;
このプログラムの出力は次のようになります。
0x22fec8 3
0x22fec4 0x22fec8 3
ヒント:
0x22fec8 iは変数のアドレスである
* pはポインタアドレスである0x22fec4
私たちは、類推によって学ぶことができる、あなたも(......長い長い、ダブルなどcharとして、)指標の多くの他のタイプを定義することができ、原則は同じです。
3.高度ポインタ交換の2つの数の値
3.1。コード1
void change(int x,int y){
int t=x;
x=y;
y=t;
}
//main
int a=1,b=2;
change(a,b);
cout<<a<<b;
輸出
1 2
aとbを入れ替えないなぜ、我々は機能変更に渡され、AとBを入れたときに、と同等のパラメータxとyパラメータは、もう一度それをコピーするので、これはだった、とbの値を変更しませんでした。
そこでここでは、ポインタを使用する必要があります。私たちは、パラメータxとyのポインタaとbのを変更することができます。この場合、我々は、内部機能の変更変更したときのx及び yの値を、我々はaとbの値の等価が変更されました。
コードは以下の通りであります:
3.2。コード2
void change(int *x,int *y){
int t;
t=*x;
*x=*y;
*y=t;
}
//main
int a=1,b=2;
change(&a,&b);
cout<<a<<b;
私たちが値aとbができるように交換されます。
3.3コード3(難しいです)
void change(int *x, int *y){
int *t;
t=x;
x=y;
y=t;
}
//main
int a=1,b=2;
change(&a,&b);
cout<<a<<b;
コードのこの作品は不可能交換であるが、その後、一部の人々は、上記のコードは、このコードはそれを行うことはできませんどのようにこれはポインタでも友人である、求めることができますか?実際には、彼は我々が時間内に渡されたパラメータの機能を知っているので、コンパイラはそのパラメータをコピーしますです、私たちがやるためにここにいる主な理由ですが、ポインタでなく、ポインタの交換をコピーすることですので、関数内でのみです効果的。
これは、パラメータ交換引数の単なる交流はなかったです。
それでも私はかなりそれを理解していませんでしたか?図。
始まり:
2のコード実行
3コードの実行
上記のチャートを通じて、我々は直感的に第三のコードがどのように間違っていることを理解することができます。
3.4。コード4拡張
あなたが気づいていない場合は、単に私たちはアンパサンドで機能変更に渡され、先行され、AとBには、知らない、このシンボルの役割は、変数のアドレスを取ることですので、アドレス文字と呼ばれています。
void change(int &x, int &y){
int t=x;
x=y;
y=t;
}
//main
int a=1,b=2;
change(a,b);
cout<<a<<b;
但是在上面代码中,参数x
和y
变量前面的符号也是&
,可是它的作用就不是取址了。这个符号叫引用符,引用符相当于给变量取了个“别名”,实际上他们两个是同一个变量。所以我们在改变参数x和y的时候,变量a和b也会相应的改变。
4. 数组中的指针
指针不仅可以应用在变量中,它还可以应用在数组中,请看如下代码。
4.1. 用指针访问数组
int a[5] = {1, 2, 3, 4, 5};
int *p;
for(p = a; p < a + 5; p++){
cout<<*p<<" ";
}
输出
1 2 3 4 5
在这个代码中,我们首先定义了指针*p
,用来指向数组a的第一个元素a[0]
,随后我们每次输出指针*p
,然后将p++
(注意这里的p++
是将p
原来指向的地址向前挪动一个sizeof(int)
,而一个sizeof(int)
的刚好是4个字节,是一个int
所占用的内存空间。所以在我们当p++
之后,p
的指针恰好就跳到了数组的下一位)。最后我们要判断,让p
不要超过数组a
所占的内存空间。
4.2. 数组与指针的关系
数组其实就是一种特殊的指针,所以说访问数组也可以这么写:
a[3] = 5;
等价于:
*(a+3)=5;
数组由于是在内存中连续存储的,所以,而数组这个a
本身他其实也就是一个指针,当我们访问a[3]
时。其实就是在访问诶这个指针后移三位的位置。那么它其实也就等价于a+3
在访问里面的内容啦。
综上所述,访问数组也可以这么写:
3[a] = 5;
5. 结构体中的指针
5.1. 定义
结构体指针就是指向结构体的指针:
struct node {
int a;
double b;
long long c;
};
//main
node x;
node *p=&x;
这时候p
就是一个结构体指针,其类型是node
5.2. 使用
怎么读取/写入结构体指针?
5.2.1. 读取
用->
运算符
//read
int a = p->a;
double b = p->b
printf("%lld\n", p->c);
或,如果你愿意写的复杂一点,可以:
//read2
int a = (*p).a;
double b = (*p).b;
printf("%lld\n", (*p).c);
5.2.2. 写入
也差不多。
p->a = 123;
p->b = 1.023;
scanf("%lld", &(p->a));
複雑なアプローチは、我々は全体を判断することができると言うことではありません。
6.アプリケーション/リリースメモリ
ポインタはメモリ空間を記載していないされた後、後に適用する必要がありますが、次のとおりです。
ヘッダファイル:
#include <cstdlib>
6.1申請
プロトタイプ:
void* malloc( std::size_t size );
関数のパラメータはを申請する数であるバイト(BYTE)のスペース。
使用法:
int *p = (int*)malloc(sizeof(int));
だから、構造を使用することができます。
node *q = (node*)malloc(sizeof(node));
6.2リリース
プロトタイプ:
void free( void* ptr );
関数のパラメータは、あなただけ適用さポインタです。
使用法:
free(p);
free(q);