プログラミング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].

C内のポインタと配列

Cでのポインタと配列

また、あなたが宣言することができます 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] = 12

4.23 5.70 1.20
8.60 3.46 12.00

さらに, 私たちも、あるPAを使用する必要はありません 1 ポインタ. または、入力することができます 1 配列と同じ方法 2 次のように通常の方法.

あなたは、私たちが持っている理由を注意してください しかし、 + で*10 + J. それはの主な機能のため() 私はことを宣言します a[10][10] マシンは、メモリセルアレイ達に割り当てられたはず 2 次元の 10 行, 10 我々はそれが不足しない場合は、まだ存在しているの列.

C内のポインタと配列

ポインタと配列 2 Cでの方法

あなたは私たちが書くことができることに気づいた[で][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 夜, 私は理解した:

C内のポインタと配列

ポインタと配列 2 Cでの方法

//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;
}

これは、ポインタ配列とみなすことができる, またはポインタへのポインタ (マルチレベルポインタ).