プログラミングC: 投稿 12 – ポインタと配列の関係, 文字列
コンテンツ
1. ポインタと配列 1 夜.
すべてのように 配列 私たちは、可変配列ポインタとみなすことができる知っている, 私たちは、ポインタの道の配列にアクセスするために配列変数を使用することができます.
//code by nguyenvanquan7826 #include <stdio.h> void nhapMang(int a[], int n) { int i; for (i = 0; i < n; i++) { printf("Nhap a[%d] = ", i); scanf("%d", &a[i]); } } void nhapContro(int a[], int n) { int i; for (i = 0; i < n; i++) { printf("Nhap a[%d] = ", i); scanf("%d", a + i); } } void xuatMang(int a[], int n) { int i; for (i = 0; i < n; i++) { printf ("%d \t", a[i]); } } int main() { // khai bao mang a co n phan tu int n = 5; int a[n]; nhapContro(a, n); xuatMang(a, n); return 0; }
最初の関数では、通常のタイピングで使用されました, 私は多くを言うことはありません.
第二の機能では、, 私達はちょうど交換する &宣言の iで[20] ポインタとみなされ、それに由来する細胞の1行分のメモリを割り当てる。 + 19. と + 私はのアドレスです[で] (すなわち、それは同等です &ザ·[で]). 位置へのポインタ[0].
また、あなたが宣言することができます 1 配列はその後使用 1 最初の配列、また配列へのポインタへのポインタ.
//code by nguyenvanquan7826 #include <stdio.h> int main() { int n = 5, i; int a[n], *pa; pa = a; // con tro pa tro toi dau mang a for (i = 0; i < n; i++) { printf("Nhap a[%d] = ", i); scanf("%d", pa + i); } for (i = 0; i < n; i++) { printf ("%d \t", *(pa + i)); } return 0; }
あなたが気づいたことがあります: なぜ我々はまだ正常を使用ポインタPA用のメモリを割り当てる必要はありません, 我々はプレートを宣言しているため[20] マシンは、記憶するためのメモリセルアレイを割り当てたはず, 我々は、アレイへのポインタpaのポインタを実行すると、メモリセルが既にパ多くのメモリセルを割り当てる必要がない. 次の例を考えてみましょう:
//code by nguyenvanquan7826 #include <stdio.h> #include <stdlib.h> int main() { int n = 5, i; // cap phat bo nho cho pa int *pa = (int *) malloc(n * sizeof(int)); for (i = 0; i < n; i++) { printf("Nhap a[%d] = ", i); scanf("%d", pa + i); } for (i = 0; i < n; i++) { printf ("%d \t", *(pa + i)); } return 0; }
この例では、VD前のように宣言された配列に含まれていない, そのように、任意の位置Paを指すことはできません, しかしやりたい我々はそのようなPA用のメモリ·セルを割り当てる必要がある.
2. 関数の配列を入力してください
割り当てられたまたはインポートする前に、前の例のように我々は、配列の要素数を持っている必要があるため、配列エントリが常に有利ではない, だから我々は、事前にユーザーが星に配列関数を入力する必要があります要素の数がわからない場合. 次の例を参照してください.
//code by nguyenvanquan7826 #include <stdio.h> #include <stdlib.h> void nhapContro(int *(*a), int *n) { int i; printf("Nhap so phan tu cua mang: "); scanf("%d", n); // khong phai &n *a = (int *) malloc ((*n) * sizeof(int)); // *a : lay dia chi cua mang a chu khong phai gia tri cua a for (i = 0; i < *n; i++) { printf("Nhap a[%d] = ", i); scanf("%d", (*a + i)); } } void xuatMang(int *a, int n) { int i; for (i = 0; i < n; i++) { printf ("%d \t", a[i]); } } int main() { int *a, n; nhapContro(&a, &n); // lay dia chi cua a va n xuatMang(a, n); return 0; }
この例では、入力および出力関数の配列を行う, メモリ割り当て関数もである. そのプログラムに記載されたキャプションと.
持っている 1 そこに、ポインタ配列を入力することにより、機能に注意することがポイント 2 記号 *. 1 配列のサインです (数の 2), 最初の兆候は、アレイの値が顎から保つことができるアドレスを転送するために使用され, それは記号のようなものだ * 関数内 HoanVi(int型 *ザ·,int型* B) そう.
3.ポインタと文字列
性質上および文字列へのそれは配列に似ている。このように、文字の配列である 1 夜, 私は上だと思います 1 少しずつ 1 簡単な例.
//code by nguyenvanquan7826 #include <stdio.h> #include <stdlib.h> int main() { char *name; name = (char *) malloc (100*sizeof(char)); printf("What your name? "); gets(name); printf("Oh, Hello %s\n", name); return 0; }
4. ポインタと配列 2 夜, ポインタの配列 - カーソルマルチレベル
ザ·. ポインタと配列 2 夜
私たちは、ポインタと配列について学ぶ上部 1 夜, このセクションポインタと配列 2 と同様の方法.
私たちは知っているように、コンピュータのメモリアレイ店の本質 2 のような次元配列 1 夜. だから我々は完全に配列を行うことができます 2 のようなポインタの次元配列 1 夜.
//code by nguyenvanquan7826 #include <stdio.h> #include <stdlib.h> int main() { double a[10][10], *pa; int n, m, i; pa = (double *) a; printf("Nhap so hang va so cot:\n"); scanf("%d %d", &n, &m); for (i = 0 ; i < n * m; i++) { printf("Nhap a[%d][%d] = ", i / m, i % m); scanf("%lf", pa + i); } for (i = 0 ; i < n * m; i++) { if (i % m == 0) printf("\n"); // xuong dong printf("%-5.2lf", *(pa + i)); } return 0; }
結果:
行と列の数を入力する:
2
3
インポートA[0][0] = 4.23
インポートA[0][1] = 5.7
インポートA[0][2] = 1.2
インポートA[1][0] = 8.6
インポートA[1][1] = 3.456
インポートA[1][2] = 124.23 5.70 1.20
8.60 3.46 12.00
さらに, 私たちも、あるPAを使用する必要はありません 1 ポインタ. または、入力することができます 1 配列と同じ方法 2 次のように通常の方法.
あなたは、私たちが持っている理由を注意してください しかし、 + で*10 + J. それはの主な機能のため() 私はことを宣言します a[10][10]
マシンは、メモリセルアレイ達に割り当てられたはず 2 次元の 10 行, 10 我々はそれが不足しない場合は、まだ存在しているの列.
あなたは私たちが書くことができることに気づいた[で][J] しかし PAを書き込むことはできません[で][J] それプラーク宣言したので、 2 午後私たちはそのようにPAがあると書くことができる 1 我々は、PA = Aを割り当てるときにカーソルと、私たちはデフォルトの配列を検討している 1 夜. だから我々は唯一のPAを書くことが許可されている場合[で10+J] (値をとる) と &しかし、[で10+J] (IPアドレスを取得します).
B. ポインタの配列
ポインタ配列はポインタと同じタイプのセットを含む配列です。.
フロート* aを[10]; // ポインタ配列を宣言. 含めて 10 ポインタ: ザ·[0], ザ·[1], ...[9]; た 10 ポインタ.
接触板 2 方法、私たちは以下のコメントを持っている: 配列の各行 2 午後私と 1 プレート 1 夜. 各ポインタ、とのその後の関係 1 プレート 1 夜, 私は理解した:
//code by nguyenvanquan7826 #include <stdio.h> #include <stdlib.h> int main() { double a[10][10], *pa[10]; int n, m, i, j; printf("Nhap so hang va so cot: "); scanf("%d %d", &n, &m); for (i = 0 ; i < n; i++) { pa[i] = a[i]; // con tro thu i tro den hang thu i for (j = 0 ; j < m; j++) { printf("Nhap a[%d][%d] = ", i, j); scanf("%lf", &pa[i][j]); } } for (i = 0 ; i < n; i++) { printf("\n"); // xuong dong for (j = 0 ; j < m; j++) { printf("%-5.2lf", pa[i][j]); } } return 0; }
私は、この例で書く理由は、ペンシルバニア[で][J] それぞれがpaがあるからである 1 一次元の配列へのポインタ. しかし、[で][J] すなわち、ポインタPAのj番目の要素[で].
私たちが宣言された配列として考えてきた上記の例[][] ポインタにメモリを割り当てる必要はありません, 今配列へのポインタにメモリを割り当てる 2 で割り当てられた二次元配列のように 1 方法、我々は、次の操作を行う:
//code by nguyenvanquan7826 #include <stdio.h> #include <stdlib.h> int main() { double **pa; int n, m, i, j; printf("Nhap so hang va so cot: "); scanf("%d %d", &n, &m); // cap phat n o nho cho n con tro (n hang) pa = (double**) malloc(n * sizeof(double)); for (i = 0 ; i < n; i++) { // cap phat m o nho cho moi con tro (moi hang) pa[i] = (double *) malloc(m * sizeof(double)); for (j = 0 ; j < m; j++) { printf("Nhap a[%d][%d] = ", i, j); scanf("%lf", &pa[i][j]); } } for (i = 0 ; i < n; i++) { printf("\n"); // xuong dong for (j = 0 ; j < m; j++) { printf("%-5.2lf", pa[i][j]); } } return 0; }
これは、ポインタ配列とみなすことができる, またはポインタへのポインタ (マルチレベルポインタ).
彼はなぜ彼私%のM zを持つI / mがoi.cho…. 私はこの場所を理解していません
私 / mは現在のピックアップです, で % mは現在の列を取ることです. VDの配列a[10][10] ときに私= 21, 現在行 2, 現在の列 1. 配列のため、 2 行が並んとして午後を考えます 1 配列として行 1 あなたが好きなように.
ああ、もっと簡単なOPPのC ++かがあります…とeラーニング…唯一の彼のシャトルを参照してくださいC言語を見つけます
現在、唯一のCっぽ.
尋ねた電子のためのビット愛します: 実施例では、アレイは、関数ポインタのレベルを使用して入力します 2 注釈でアレイがそこにあっham.Eない限り有効なままが、関数のパラメータはレベル1へのポインタである書き換えしようとすることができ、結果はアレイが依然として可能な説明のための値を取得することです電子でありますしません?ポインタの必要性Fを求めた。なお時?
ここでの電子コード:
#含まれる
#含まれる
#含まれる
ボイドnhapmang(int型* A,int型のn)
{
のために(I = 0 int型;で<N;私 )
{
printfの("\na[%D]=",で);
scanf関数(の "%D",(+の私));
}
}
で無効に(int型* A,int型のn)
{
のために(I = 0 int型;で<N;私 )
{
printfの("%d ",ザ·[で]);
}
}
メインint型()
{
int型* A;
int型のn;
=(int型*)のmalloc(N *はsizeof(int型));
printfの("\nNhap n=");
scanf関数(の "%D",&N);
nhapmang(ザ·,N);
に(ザ·,N);
}
申し訳ありませんが、あなたはブログで数日ではありません. 配列はポインタ値を保持し、もちろん、あああなたを保ちます. カーソルは、配列の形式であるので、, それは、より柔軟な何もありません.
Fポインタを使用すると、配列Fを操作する必要があるときに使用されます. 列の行の数を定義するために必要とされる関数fに配列ので、, ポインタは必要ありません.
細心の注意を払って彼の記事, 興味深くかつ有用. 投稿ありがとうございました. より多くの記事が掲載されて持っていると思っています! かわいいです.
私のないポインタ用の一部の動的メモリ割り当てハァッ. こんにちは彼はさらに先にこれを訴えたvongj.
あなたはいくつか見て 9 NHE.
大井, eは場所を理解していません “*(*ザ·)” この先生は何ですか?
ボイドnhapContro(int型 *(*ザ·), int型* n個)
マーク * 最初は、彼らが関数から抜け出す値を維持することができることです. マーク * 種類 2 ポインタを参照します
ウェイター, セグメントレベルで発表 2 私はこのDCのように実行されません。このプログラムを使用した理由次元.
*PA = (ダブル*) のmalloc(N * はsizeof(ダブル));
のために (I = 0 ; で < N; 私 ) {
// 各ポインタのための粋メートルのOブドウキャップ (moiのハング)
しかし、[で] = (ダブル *) のmalloc(M * はsizeof(ダブル));
最初のコマンドは、オフラインとしてこれを使用する必要があります
PA = (ダブル**) のmalloc(N * はsizeof(ダブル));
文字列AKの端にポインタを与えるためにどのように
のために (I = 0; で < *N; 私 ) {
printfの("Nhap a[%D] = ", で);
scanf関数(の "%D", (*ザ· + で));
}
}
// *nの (*+の私) ここで私はまだそれを得ることはありません, 彼はあなたが香港を得るのを助けるために通り抜けました, あなたのおかげそんなに多く :)))
nがポインタを渡されているので, ユーザーにその値を利用したいはずです* n個, * nはnの値を測定することを意味. 長い配列はポインタとして使用することができなければなりません. *ザ· + 私は、アレイA内のi番目の位置であります.
ああ、あなたは、配列のサイズは、 1 定数は、通常、直流変圧器ではありません.
メインint型()
{
const int型のn = 5;
int型A[N];
nhapContro(ザ·, N);
xuatMang(ザ·, N);
getchは();
リターン 0;
}
彼らは名前を保存するために、配列のポインタを使用してバッファに分離され、それらを保存するために、私は彼に尋ねました 1 配列名は、実行中のプログラムが停止しています. エラーは、彼が私を見助けてどこか分かりません
無効TachTen(CHAR * S, するchar * A){
int型のL, で, J, へ;
I = strlen関数(S)-1;
J = 0; K = 0;
L = STRLEN(S);
fflushは(標準入力);
同時に(S[で] != ‘ 「){
で–;
}
同時に(で < L){
ザ·[J] = S[のi 1];
私 ;
J ;
}
}
無効TachHo(CHAR * S, char * bの){
int型の私, J, へ;
I = strlen関数(S)-1;
J = K = 0;
fflushは(標準入力);
同時に(S[で] != ' '){
で–;
}
のために(J = 0; J<で; J ){
B[J] = S[J];
}
}
ケース 3: //10下のSX
printfの("\nn = %d", N);
のために(I = 0; で<N; 私 ){
ザ·[で] = (CHAR *)のmalloc(100*はsizeof(タンク));
B[で] = (CHAR *)のmalloc(100*はsizeof(タンク));
}
のために(I = 0; で<N; 私 ){
TachTen(EN[で].十, ザ·[で]);
printfの("\nTen sv[%D]: ", のi 1);
のために(J = 0; J<strlen関数(ザ·[で]); J ){
printfの("%c", ザ·[で][J]);
}
TachHo(EN[で].十, B[で]);
printfの("\nHo sv[%D]: ", のi 1);
のために(J = 0; J<strlen関数(B[で]); J ){
printfの("%c", B[で][J]);
}
}
禁止バイロイ・o・レン中のCO(S[で] !=「「){
私-;
}
で– 新しいユーザー.
ポインタと配列で自分の質問 2 二次元なぜ、このコード
PA = (ダブル *) ザ·;
彼は追加する必要がありました理由 (ダブル *) ザ·; ?.
double型のポインタ変数をキャストする許可されています. PAのポインタ変数は、キャストする必要がありますので.
自身が試験を割り当てる際に、配列ポインタPA = AとPAを割り当てるときに、それを行使するように頼ま= (ダブル *) そう. 彼のおかげで !!
ああ、すべての配列はどこカーソル必要とされていないと, あなただけの通常の[OK]を実行します. この記事だけでは、それらの間の関係についての彼の理論を概説しました.
最愛の人のところ私は、彼が近くにそれがない説明することができます10 + PA + jは*.
PAはポインタであります. しかし、 + Xは、より高度なポインタのX部であります. それは同等です[X]. しかし、 + * 10で + に相当J[私は10 + jを*].
ああのための最初の例では、質問F 3 一部 1, なぜ、とき子供のショーのためのE PA内Caメモリ 3 または 2 メモリセル(N) DCは、まだ十分に入力します。 5 分子先生:
PA = (int型 *) のmalloc(3 * はsizeof(int型));
彼は、ボイドに私に尋ねました(int型 *(*ザ·), int型* n個)
DCのためにメモリを割り当てるnは、まだ彼のゲームを入力する必要はありません ?
この関数呼び出しを使用するときため、 &NHEなしするアドレスを送信するn個.
広告の文字をインポートおよびエクスポートする配列のポインタを使用しますが、その泳ぎを繰り返しミルク上を通過させました, 広告との懸念を表示:
#含まれる
#含まれる
無効nhap(文字** S, int型のn){
のために(I = 0 int型;で<N;私 ){
printfの("\ns[%D]=",で);
scanf関数("%s",S[で]);
}
printfの("\ns[%D]=%s",0,*S[0]);
}
無効xuat(文字** S, int型のn){
のために(I = 0 int型;で<N;私 ){
printfの("\ns[%D]=%s",で,*S[で]);
}
}
メインint型(){
int型のn;
printfの("nhap n:");
scanf関数(の "%D",&N);
CHAR * S[N];
nhap(S,N);
printfの("\nMang vua nhap: ");
xuat(S,N);
}
あなたは常に、配列のポインタを使用することができます 2 彼が入ったことが、結果午後k個の星状図アウト ?
#含まれる
メインint型()
{
int型A[10][10];
int型のn,M,で;
printfの(“行と列の数を入力します。 : “);
scanf関数(“%D%D”,&N,&M);
のために(I = 0;で < N *メートル;私 )
{
printfの("a[%D][%D] :",I / M,I%メートル);
scanf関数(の "%D",+の私);
}
のために(I = 0;で<N *メートル;私 )
{
もし(で % メートル== 0) printfの("\n");
printfの("%d ",*(+の私));
}
リターン 0;
}
彼の記事は非常に便利です.