プログラミングC: 投稿 11 – C言語でポインタ
コンテンツ
1. Cでの紹介ポインタ
私たちは、過去に知られており、使用している変数は、サイズと識別データ型で可変です. 彼らは、このタイプの変数は静的変数である呼び出す. あなたは静的変数を宣言すると, 可変量のメモリセルは、そのメモリセルの全てかを使用して、プログラム実行中に知ることなく配分される. 一方, 静的変数のこの形式は、プログラムのみを使用して変化にもかかわらず、プログラムの実行中に存在します 1 使い捨て.
静的変数を使用する際にいくつかの制限が発生する可能性がある:
- メモリセルバランスを割り当て, 無駄なメモリセルを引き起こす.
- 不足しているメモリセルを割り当て, プログラム実行エラー.
制限を上避けるために、, C言語は、次の特性を持つ特殊変数と呼ばれるボラティリティを提供してくれます:
- 唯一の起動プログラムで発生するしない、プログラムの実行中に発生する.
- プログラムを実行しているとき, 変数のサイズ, メモリとメモリアドレスが変更されることがあり、変数に割り当てられる.
- あなたが使用して終了したら、それは遊離は、メモリ内のスペースを節約することができます. ただし、特定の対処していない変化が私はそれらにアクセスすることができません. 従って, C言語では、これを克服するために、再度変数の特別な種類を提供してくれます, あるポインタ変数 (ポインタ) 特性を持つ:
- ポインタ変数は、データのアドレスが含まれているデータが含まれているか、データを含むメモリのアドレスが含まれていない.
- ポインタのサイズは、データの種類に依存しない.
2. ポインター
各変数はに割り当てられていると宣言される 1 特定のメモリ領域どこ (アドレス) 異なる. ポインター 変数 変数のアドレスを格納するために使用.
2.1 例
// e.g about pointer - code by nguyenvanquan7826 #include <stdio.h> int main() { /* khai bao bien x va bien con tro px */ int x, *px; px = &x; /* &x : tra ve dia chi cua bien x * px = &x : gan dia chi cua bien x cho px hay px tro den x */ x = 42; printf("Vi tri cua bien x la %p \n", &x); printf("Noi dung cua bien x la %d \n", x); printf("Vi tri cua bien x la %p \n", px); printf("Noi dung cua bien x la %d \n", *px); *px = 7826; printf("\n -------- \n\n"); printf("Noi dung cua bien x la %d \n", x); printf("Noi dung cua bien x la %d \n", *px); return 0; }
結果:
結果:
ラX記録 42
viのトライCUAもX 0x7ffe064348fc
ラX記録 42
--------
ラX記録 7826
ラX記録 7826
このオープニング例を通して、私たちは、以下の点を描くことができます:
ザ·. カーソル変数を宣言
データの種類ごとに、我々はそれぞれ、その型のポインタ変数を持つ.
タイプ * 名前ポインタ;
上記の例では、宣言 1 int型PXのポインタ変数.
B. を指し示すポインタの規制
私たちは、演算子を使用 & アドレス用 1 変数とそのアドレスポインタを割り当てる.
=ポインタに名前を付け &変数;
℃. アクセス方法
カーソルPXして上に持っている 2 許可証はあるが:
- PX : それが保たれるアドレスを取得します (ポイントへ)
- *PX : それが指すメモリの値を取得.
上の例では、代入後にそれを見ることができます PX = &x; その後、我々は書く:
- PXはに相当します &X
- *PXはXに相当します. および計算の*のピクセルに使用することができる, 表現.
D. ポインタ上のいくつかの操作
// e.g about pointer - code by nguyenvanquan7826 #include <stdio.h> int main() { /* khai bao bien x va 2 bien con tro px, qx */ int x, *px, *qx; px = &x; printf("Nhap gia tri cho vung nho px tro toi: "); scanf("%d", px); /* px la con tro nen khong viet scanf("%d", &px); */ qx = px; /* gan gia tri cua px cho qx, qx cun tro toi x*/ printf("Vi tri cua bien x la %p \n", &x); printf("Vi tri cua bien x la %p \n", px); printf("Vi tri cua bien x la %p \n", qx); printf("Noi dung cua bien x la %d \n", x); printf("Noi dung cua bien x la %d \n", *px); printf("Noi dung cua bien x la %d \n", *qx); // tang gia tri cua o nho len, <=> x = x + 7826 *px += 7826; printf("Noi dung cua bien x la %d \n", x); px++; /* cong them mot don vi cho px * => px tro toi vung nho tiep theo */ printf("Vi tri px tro toi la %p \n", px); return 0; }
結果:
入り江のPX灰TOIの値を入力します: 42
ViにトライよくCUA X 0xbfba58a0
ViにトライよくCUA X 0xbfba58a0
ViにトライよくCUA X 0xbfba58a0
ラX記録 42
ラX記録 42
ラX記録 42
ラX記録 7868
ビトロソートのPXあなたの0xbfba58a4
例えばのために我々は後に共通のポインタに対していくつかの操作で見た: (多くの他の操作に加えて、).
- 2 同じ型のポインタ変数は、相互に割り当てられているか、整数のために公共の会計処理を行うことができます, マイナス 2 それぞれのポインタ. 上記の例では、計算を実行する:
- 近くに: Q X = PX; それを受信したときのピクセルのqxの値は、変数xのアドレスである, すなわちpxとQXとXを指している. さらに、我々は以下を割り当てることができます: Q X = PX + 2; QXと, PXは同じポインタ型です. 引き算 2 同じ型のポインタが返されます 1 整数値 (int型). これは距離であり、 (いくつかの要素) 間に 2 ポインタを含む
- 増加する: 増加または減少を許可, 減算は同じポインタ演算変数で実行され. 唯一の違いは、それが上下することである, プラスまたはマイナスそれが有する単一バイトの種類に応じて.
最高経営責任者(CEO. 上記の例では、増加させることが可能である: PX ; と仮定した場合、このアドレスPXを指している: 0xbfba58a0、その値が増加することができ (場所へのポイント) 0xbfba58a4 (増加する 4) PXはあるので、そのint型のint型のアカウントの各ポインタ変数 4 メモリ内のバイト. - さらに、我々は*のPX 数学によって、変数xの値を変更することが許可されている= 3; 本質的には、この操作は、メモリ内の値を変更した (アドレス) そのPXポイントへ, 変数xの値をもたらしたに応じて変更される.
あなたが気づいたことがあります:
- コンパイラや、異なる種類の容量であるオペレーティングシステムに応じて、. (これはint型アカウントの翻訳です 4 バイトが、それが占有している他のサービスで 2 バイト). ストレージのタイプごとに、あなたは、sizeof演算子を使う() しかし、すべてで 2 言及.
- また、オペレーティング・システムの各ポインタ変数に依存, カーソルの関係なく、どのタイプ (int型, フロート, ダブル,...) また、同じバイト数を占めています. オペレーティング·システム 32 ポインタ変数経理ビット 4 バイト, OS 64 ポインタ変数経理ビット 8 バイト.
3. 割り当て、メモリを回復
ザ·. 割り当て:
この1小さな例に先立ち.
// e.g about pointer - code by nguyenvanquan7826 #include <stdio.h> int main() { int *px; *px = 42; printf("Vi tri con tro px la %p \n", px); printf("Gia tri con tro px tro toi la %d \n", *px); return 0; }
コンパイルされたとき、それはメリットはありません (警告), ランはそのプログラムを実行することはできませんときバックアウトします.
その理由は、カーソル変数の宣言は、新しいマシンをPX場合にのみ提供するということです 2 ポインタデータ格納PXにメモリを割り当てるしていないポインタ変数のアドレスを格納するバイト. (同じような協力的な供給 2 あなたが同じことをするが、あなたのリングをメッキあなたに土地を与えないために米のキロ ).
注意: そこにコンパイラエラーの数がありますが、まだ正常に実行されませんが、最高のは、私たちが使用を割り当てるべきであるということです. あなたは私たちが、後で議論する配列へのポインタを使用する場合に、このエラーが最も明確に表示されます.
まあ我々は重要な問題に行きました, ポインタにメモリを割り当てる方法.
私たちは図書館stdlib.hで次の関数を使用ポインタにメモリを割り当てるために、.
- のmalloc : 名前をカーソル= (ポインター型 *) のmalloc (はsizeof(ポインター型));
- のcalloc : 名前をカーソル= (ポインター型 *) のmalloc (N, はsizeof(ポインター型));
そのはsizeofで(ポインター型) 型のサイズ; nはsizeof演算子の数であり、(ポインター型) 付与された.
// e.g about pointer - code by nguyenvanquan7826 #include <stdio.h> #include <stdlib.h> int main() { int *px, *qx; px = (int *) malloc(sizeof(int)); qx = (int *) calloc(1, sizeof(int)); printf("Vi tri con tro px la %p \n", px); printf("Gia tri con tro px tro toi la %d \n", *px); printf("Vi tri con tro qx la %p \n", qx); printf("Gia tri con tro qx tro toi la %d \n", *qx); return 0; }
ここでは、注意してください: mallocとmalloc関数で割り当てられたときには、単に理解はcallocの唯一の違いは、機械PXを割り当て 1 どのようなデータで知ることなく、任意の細胞またはデータなしに細胞 (*上記のように貴重なPX) あまりにはcalloc、だけでなく、他の 1 マシンは自動的に常に値を割り当てます後にポイントが割り当てられている 0 変数のqx指すメモリセル, ニュースQXのデフォルト値です 0.
ポインタを割り当てるとき 1 我々は欠けなどを割り当てる必要がある作業工程中のメモリセルの一定量は、コマンドを使用し reallocを:
名前をカーソル= (ポインター型 *) reallocを (カーソル名, に割り当てられた量 * はsizeof(ポインター型));
その中で: 古いに割り当てられた=金額 + 招待する.
最高経営責任者(CEO: 当初我々は、ポインタがPXで割り当てられた 10 メモリセル.
その後、多くを割り当てるしたい 5 複数のメモリセルが、量が割り当て= 15.
B. 回復は、残りのメモリを確認
我々が使用するメモリ割り当て関数を回復するには 無料で(カーソル名);
3. カーソルの機能
すべてのように Cでの置換関数 我々は、パラメータAを渡す方法を知っている,HoanVi機能におけるbはアドレスではない送信により、値渡しされる (またはパラメータ) 従って、関数の変数の値が変更されたが、機能が実行された後、値は、まだ変更するいても. そして、我々は渡すパラメータにより改訂されるスワップにカーソルポインタbは、そのメモリセルのアドレスに交換することができる形式. そして、我々は望ましい結果を取得するとき.
// e.g about pointer - code by nguyenvanquan7826 #include <stdio.h> void hoanVi(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int a = 42, b = 7826; printf("Truoc khi goi ham hoan vi: a = %d, b = %d \n", a, b); hoanVi(&a, &b); printf("Sau khi goi ham hoan vi: a = %d, b = %d \n", a, b); return 0; }
あなたは自分自身が尋ねました . あなたは、ポインタと配列はないについてのドキュメントや例を持っています. 例えば配列 10 カーソルや配列へのポインタ 10 要素!
ありがとう
それはカイを運ぶようなものでした 2 フィン移動. あなたはこれらの事件を書き込む直前に共同消去鞭. 裸の心を参照してください持ち込み禁止
ベトナムはメモリを割り当て ,コマンドを使用することができます : ポインタ=新型DC KO彼
はい、それは、C ++であなたああです
あなたが何を考えている%のP
それは変数のアドレスを印刷しています
あなたはint型を変更した場合 * int型のPX &彼は別の後、ではないPX. それ以外の場合は、彼が私に先生KO DCを説明する助け
ありがとうございます!
int * PXを宣言するとき、それはあります 1 構造体ポインタを宣言します, そして、int型を宣言する必要はありませ &PX.
なぜ. 私は、彼らがそのような宣言、初期化リストを見ます
空洞khoitao(DS A,int型 &N)
{
n = 0で;
}
彼が正しいか間違っています
ああそれは、関数内で使用されています. 場合、そのような宣言時オフ機能、それが宣言のように* PXがこの変数の値を変更することが許可されています. しかし、それは、C ++であり、この関数の呼び出しは、退職変数伝送にだけ対処顎に送信されていない場合.
あなたはより多くを学ぶために、例えばこれを見ることができます:
https://www.cachhoc.net/2014/12/12/lap-trinh-c-bai-6-ham/#VD3_Ham_hoan_vi
その彼の領域を指すポインタの理由を規定.
これは、期間を指す、メモリセル値のカーソル制御のためのものです…
ありがとうございました
場合は、y = * zのようなぶらつきます
yが変数であります
Z・ラ・カーソル
Auを助けeで述べました
@@のGiホイアンはあなたを理解していません
#define PA_ODR *(unsigned char型*)0X5000
あなたが発注されているものに聞かれる質問の意味 ?
一定のコマンドを定義します
だから私は、参照目的に使用しました (最高経営責任者(CEO): フロートトング(フロート &ザ· ) 何彼を行うには定義された関数として
だから、機能をオフに取得した後、, 可能な変更の値. 例えば、に入る前 5, 関数を入力した後、それがあります 9. Sau khi ra khỏi hàm a vẫn có giá trị là 9 chứ ko trở về 5.
dùng hàm trả về là 1 tham chiếu( 最高経営責任者(CEO) : int型 & myfunc() )để làm gì vậy anh.!!! .em tks . em thấy mấy sách khai báo như vậy nhưng ko hiểu nó dùng làm gì ?
Cái này mình cũng chịu. Chưa dùng thử bao giờ 😉
có thể cho e vd về sử dung con trỏ kết hợp vs struct ko 🙂
あなたは試します 2 bài này xem
https://www.cachhoc.net/2014/12/21/lap-trinh-c-bai-13-danh-sach-lien-ket-don-cai-bang-con-tro/
https://www.cachhoc.net/2014/12/19/lap-trinh-c-bai-11-kieu-cau-truc-struct/
A Quân học trường nào thế? a Sn bao nhiêu nhỉ?
最初の行 6 trong ví dụ 2 bạn đưa ra:
printfの(“入り江のPX灰TOIの値を入力します: “);
scanf関数(“%D”, PX);
これを好きに見えました:
printfの(“入り江のPX灰TOIの値を入力します: “);
scanf関数(“%D”, *PX);
あなたは、この場所は賢いではない説明することができます????
カーソルのPX PXコールは常にDJKため、, それは〜のようでした。 &ザ·. * PXはまた、呼び出しのように、その値と呼ばれます.
彼は、ポインタのサイズを確認するために私に尋ねたです 2 どの先生にかま.
例えば、あなたがはsizeofを使用するint型のサイズをチェック() . しかし、電子のsizeofを使用したとき(P) またはのsizeof(*P) ないアウト 2 一口.
こんにちは.
記事では、作業の過程でメモリセルの不足へのポインタを見つける電子メールを述べました. 場合は、子供たちのためにすることができますが、作業の過程でメモリポインタを欠いているが、それはありません ? プラス、彼はあなたのKOサーのcallocを得るのを助けるために関数のnの役割についての詳細を言うことができます ?
例えば、我々はもともとに割り当てられました 100 メモリセル, しかし、原因超えた後者の量を節約する必要性に 100 欠落しています.
Nは、細胞の数は、メモリを割り当てる必要があります.
なぜ最初のインスタンスの最初の例ということメモリを割り当てるべきではありません 3 メモリ先生を割り当てる必要.
前の例のように、それはあなたが直接、次に割り当てられています.
では、なぜあなたのようなボタンを持っていません
pDestに=はstrstr( 文字列, STR );
結果= (int型)(pDestに – 文字列 + 1);
弟のnguyenvanquan7826は、彼らが文を取得した説明しました 2 スターは、文字列strによってトライ直流マイクロ融資を返します。
psestは、各ローンのスターブドウchuoiのトゥルーラミリアンペアの直流列に配置されています
eはのために彼に尋ねました. あなたの記事は、命令で媒体としてどのように電子のKHはそれでコードを持っていたように、Eは、ビットのようなブログサイトを作成したいです. KHする電子を表示することができます… 電子すでにPHPを知っています , CSS, HTML , eがすべてを構成し、完成DBへ保存したいその後、ちょうどそれは、まさにこのような説明のコードを持っていたポストを書くことができる方法を知っているKH thuiがアップロード…
あなたは、ワードプレスNHEを学びます. 私はそれを使用しています.
あなたは、メモリアドレスをホストするために2バイトのポインタを占めている自分自身に尋ねることができます, しかし、例えばように、開口部は、変数xの位置は0xbff327e4あります, この数は、2バイト以上であります. 私は本当にこの場所を理解していません, あなたはとの不安に答える願っています
あなたは私のint * P1に説明することができダーリン=&X , int型** P2 =&P1. それはどのようにKO先生意味します? int型* P1 =と&対のint * p1のようにそれをxは; P1 =&Xまったく先生ありません? 私は感謝します
これは、ポインタP1のxのアドレスが割り当てられています, p2のポインタへのアドレス割り当てP1. それに類似するものを投稿NHE.
ウェイター, 例で 2 部2a Iの割り当て, どうやら彼は* PXに値を代入しませんでした, 注意彼は上記のように貴重な* PXを記録した、底部. それはどのような彼の出てくるように、Eは、プログラムの結果を求めます? そして、nは彼のcallocに腰を適切にランダム化, 私は大きいサイズのn腰でプログラムを実行した場合、それがどんな影響を与えます. Eのおかげサー
私は、プログラムがエラーになると言いました. また、nはあなたがしたい番号です, とともに 1 他の画素と同様に、nは 1. 試験セクション場合、アレイが有するN N配列要素の数であります.
彼は私に尋ねました, ポインタ自体は可変で, それは、自分自身のアドレスを持っており、メモリのメモリセルます. 我々は他のアドレスを指すように異なるカーソルを使用することができます彼のポインタではありません?
😀 Xin lỗi em chưa đọc kĩ mấy câu hỏi bên trên. だから、私は尋ねてみましょう, 他の種類の先生は何のポインタとchar型のポインタとの違い. 電子番組は宣言することができるよう: char * S ={“ABC XYZ”}
しかし、int型ではない* I ={“1,2,3”} . ありがとうございます.
char型のポインタのポインタだけで、別の停止. しかし、あなたは、ポインタと配列を読めば、それはリンクがあります, char型のポインタが考慮されます 1 文字の配列を文字列として扱われるべきです.
あまりにも持っています.
彼はそれがない、カーソルのアドレスと異なるの変数のアドレスポインタのどの頼ま ?
たとえば、
int型、A = 5;
int型* P;
P =&ザ·;
printfの(“テールカイデー : %P”,&ザ·);
printfの(“\pは%pに指していることを、変数のndia費”,P);
printfの(“\ndiaの姉妹のp%pを”,&P);
2 最初の行は同じであるが、第二のラインであります 3 その後、他の値の先生 ?? 彼があなたの質問に答えることを期待 (((: .
あなた以外の, 店舗のp個のアドレスが、それはどこにそのアドレスを保存することができます.
Anh ơi cho em hỏi là em đọc trong sách thì giả sử khi ta khai báo 1 mảng là a[2][3] その後:
a là địa chỉ của a[0][0];
a+1 là địa chỉ của a[1][0];
a+2 là địa chỉ của a[2][0];
しかし、それは+ 1ポイントに彼のポストを残したとして、あなたは直後からセクションのアドレスを確認するには%pを使用する場合[2][3] いつも先生. 彼は子供たちと一緒に家庭を説明しました, 私は感謝します
直後[2][3] 要素?.
印刷%pのEテスト + 1
と%pを &ザ·[0][1] 見ます.
#含まれる “stdio.hに”
#含まれる “conio.hでは”
#含まれる “math.h”
#含まれる “string.hの”
メインint型()
{
int x=5;
int *p=&X;
printfの(“%d\n”,*P);
P =(int型*)のcalloc(5,はsizeof(int型));
のために(I = 0 int型;で<5;私 )
*(p+i)=i+1;
のために(I = 0 int型;で<5;私 )
printfの("%4d",*(p+i));
getchは();
}
彼は、このコードが間違っ先生が何であるか私に尋ねました ???
何が悪い、あなたはことを知っているアップ実行します.
include thì dùng kí tự not “” va dùng hàm calloc thì phải khai báo hàm stdlib.h. vì hàm này hỗ trợ nó.
私は彼を迎えました, 子供たちは混乱の問題を抱えています, 私はあなたを助けるための答えのために少し時間を願っています.
#含まれる
無効関数func1(int型A) {
int型のx;
X = A;
printfの(“xの住所: %P, X =%d個の nを”, &X, X);
}
無効func2の(int型A) {
int型のy;
printfの(“Yの住所: %P, Y =%dの”, &と, と);
}
メインint型() {
関数func1(5);
func2の(8);
リターン 0;
}
私はこのプログラムを実行し、その結果を取得します:
xの住所: 0x7ffeefc1a31c, X = 5
Yの住所: 0x7ffeefc1a31c, Y = 5
私がお聞きしたいAものの、なぜアドレスと変数yのアドレスの値が変数xの様々な値であり、?
私も試してみましたが、現在は、なぜ理解できません…
xの住所, Yはそれを返します。.
Bạn xem có thể đính chính lại điểm này nhé, mình thấy chưa hợp lý:
“ポインタのサイズは、データの種類に依存しない, 常に固定サイズを有する 2 byte.”
Theo mình nghỉ, bạn đang nói biến con trỏ kiểu void *. この変化は、マイクロコントローラアーキテクチャに依存します, マイクロプロセッサ.
それが指すデータの種類に応じてポインタ変数, メモリセルのアドレスに対応するカーソルの大きさ.
かわいいです!
ありがとう, 私は、NHEを修正しました. しかし、カーソルのサイズは常にNHEしかし同じスタイルであります.
また、オペレーティング・システムの各ポインタ変数に依存, カーソルの関係なく、どのタイプ (int型, フロート, ダブル,...) また、同じバイト数を占めています. オペレーティング·システム 32 ポインタ変数経理ビット 4 バイト, OS 64 ポインタ変数経理ビット 8 バイト.
彼は私に尋ねました, bên trên anh khai báo 2 biến a , B、その後、彼のあごにそれを作るために 2 ポインタ*のA, *B. 私はその場所の先生を得ることはありません, 彼はそれではない私に説明しました, ありがとう
後に出て、あなたのあごという変数の値を保存するためにカーソルを使用. あなたが関数内でカーソルを使用しない場合、それはどこの変数の値を保存しません。.
みなさん、こんにちは, 独学自身がプログラミング 1 今ヶ月. 学習者のためのページかなり曖昧cachhoc.net上のカーソルのレッスン, カーソル間の本質を表現していません, MEMORY変数内.
私は、文書がページを参照してくださいしているdaynhauhoc.com, あなたは、Googleで検索することができます “初心者のためのCプログラミングドキュメント” ドキュメントを検索します. 当然のことながら, bạn học sẽ nắm rõ được bản chất và cũng rất hài hước khi học nữa 😀
Cảm ơn bạn đã chia sẻ.