ポインタの記事|多段拍手の手でプレーすることを教えます

可能な限りそれを理解し、回避することは困難ため、その複合体の使用量の比較的高いレベルと見なさ二ポインタ、多くの人々 、。しかし、大規模なプロジェクトの開発に、多くの場合、二つのポインタを使用しないように、と私たちは存在ポインタの意味を統合助けることができる2つのポインタを学ぶことができない、二つのポインタを学んだ、本当にあなたの感覚にC言語を習得。パラメータポインタの関数としての存在意義は、二次ポインタ例外なく、使用されています。:パラメータの関数として、我々は完全に機能するシステムに比べて主な機能を入れて、サブ機能モジュールを作るためよりも、特定の機能を持っているし、タスクのほとんどのために、私たちは、次の2つの要件があります
から、特定の機能を実行するためには1.機能を主な機能は、適切な情報を入力するための主な機能サブルーチンを必要情報を取得します。
2.サブルーチンメイン関数に対応する出力情報を必要とするより良いシステムの機能を実行するためにメイン関数、サブ関数から情報を取得する必要性を、。
上記入力および出力機能は、最大の意義は、ポインタ関数パラメータ男として使用されます。したがって、2つのポインタが、関数のパラメータである場合には、以下の詳細な会話を展開し、入出力特性のために使用されます。

入力ポインタとして1

ポインタは、入力として、データ転送のサブルーチンへのポインタを介して主要な機能は、動作するデータサブ機能の主な機能は、主な機能でメモリ空間を割り当てる必要があります。メモリモデルがある場合、次の3つのポインタが入力されています。

void main()
{
    int i = 0;

    //第一种:指针数组
    char *   p1[] = {"123", "456", "789"};


    //第二种:二维数组
    char p2[3][4]  = {"123", "456", "789"};

    //第三种:malloc二维内存
    char **p3 = (char **)malloc(3 * sizeof(char *)); //int array[3];

    for (i=0; i<3; i++)
    {
        p3[i] = (char *)malloc(10*sizeof(char)); //char buf[10]

        sprintf(p3[i], "%d%d%d", i, i, i);
    }
}

3つのメモリモデルのメモリとして以下の図IV、我々は直感的に類似点と相違点の2個のポインタメモリモデルの3種類を図ことができるはずメモリの4つの分野。


5529997-3cee378414cde42c.png
5529997-69979958b7d47104.png
5529997-e43c00bc5e8bed18.png
出力として2.ポインタ:

出力情報機能主な機能、体内のサブ機能で生成された情報、そのために、我々は、サブルーチンでメモリを割り当てる必要があり、関数が子関数に割り当てられたメインメモリに使用することができ、メモリ空間はヒープに割り当てする必要がありますとき、サブルーチンが終了すると、メモリは自動的に解放されることはありませんように。もちろん、メモリの主な機能に空きヒープ・スペースを忘れないでください。

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

 
//指针做输出:被调用函数分配内存 
//求文件中的两段话的长度
int getMem(char **myp1, int *mylen1, char **myp2, int *mylen2)
{
    char *tmp1 = NULL;
    char *tmp2 = NULL;
    tmp1 = (char *)malloc(100);
    if (tmp1 == NULL)
    {
        return -1;
    }
    strcpy(tmp1, "abcdefg");
    *mylen1 = strlen(tmp1);

    *myp1 = tmp1; //间接修改实参p1的值

    tmp2 = (char *)malloc(100);
    if (tmp2 == NULL)
    {
        return -2;
    }
    strcpy(tmp2, "11122233333");
    *mylen2 = strlen(tmp2);

    *myp2 = tmp2; //间接修改实参p1的值
    return 0;
}

int getMem_Free(char **myp1)
{
    if (myp1 == NULL)
    {
        return -1;
    }
    tmp = *myp1;
    free(tmp);  //释放完指针变量 所致的内存空间
    *myp1 = NULL;  //把实参修改成nULL
    return 0;
}


void main()
{
    char  *p1 = NULL;
    int len1 = 0;

    char *p2 = NULL;
    int len2 = 0;

    int ret = 0;

    ret  = getMem(&p1, &len1, &p2, &len2 );

    printf("p1: %s \n", p1);
    printf("p2: %s \n", p2);

    getMem_Free(&p1);
    getMem_Free(&p2);  

    return ;
}

注:上記のコードは、あまりにも多くの分析、個人の愚見、メモリモデルあなたの大脳皮質に刻まれた4つの地区をすることはありません、あなたは最終的に拍手へのポインタを再生します。emmm、私は次再生します。4つの地区とそのメモリモデル下図のコードセグメントによると、私たちはコードのみ無料tmpに、最終myp1はポインタは野生のポインタになることがわかりました。


5529997-73ea902141d8f88f.png

その後、次のコードセグメントIVとそのメモリモデル、我々は、ポインタパラメータフィールドのポインタとして、より高いレベルで防ぐことができることがわかりました。

5529997-c45c0040c26252a3.png

ます。https://www.jianshu.com/p/fe2d00e6f596で再現

おすすめ

転載: blog.csdn.net/weixin_34192732/article/details/91199901