C言語のメモリ管理とポインタと文字列と配列

Preposition_Question:

//指针
int * pz;

//数组
int zippo[4] = { 1, 2, 3, 4};

int zippo[4][2];

//指针和数组

int (*pz)[2];

int *pa[2];

//字符串和数组
char * heart = "I love c language!";
char head[] = "I love c language!";

//字符串和二维数组
const char * mytalents[5];
char yourtalents[5][40];

上記のコードについて漠然としている場合は、この記事でそれらの関係を明確にすることができます。

================================================== =====

C言語のメモリ管理

上記のコードを理解するために、C言語のメモリ管理の知識は克服できない知識のポイントです。

C言語のメモリ管理

要約すると、私たちは知っています:

初期化/未初期化グローバル変数と静的変数は、それぞれ静的ストレージ領域のbssセクションとdataセクションに格納されます。初期化されていないパラメーターは、プログラムの起動時にクリアされます。

したがって、静的ストレージ領域のすべてのパラメーターが割り当てられます。

文字リテラルは静的ストレージ領域の定数領域に格納されます;変数はスタック領域に格納されます;

 

#include <stdio.h>

int main(void)
{
    int * pz;    //在函数里面定义就会被存放在栈区,程序运行时分配    

    int zippo[4] = { 1, 2, 3, 4};    //一维数组,存放在栈区,程序运行时分配;

    int zippo[4][2];        //二维数组,存放在栈区,程序运行时分配;
                            //从左往右的优先级,(1)先是一个内涵4个元素的整型数组
                            //(2)每个元素又包含两个整型元素

    //数组指针    主语是指针,数组是修饰语;    指针指向数组(指向数组的指针)

    int (*pz)[2];        //注意优先级:先算括号的,(1)pz首先是一个指向整型数的指针
                        //(2) 再跟[2]结合,表示指向的是一个内涵2个元素的数组

    pz = zippo;    //不会报错,pz就是指向内涵两个元素的指针
    
    //指针数组    主语是数组,指针是修饰语,数组里保存指针
    int *pa[2];    //这种形式表示:pa先和[2]结合,表示是一个内涵两个元素的数组,
                    //再和*结合,表示数组存放整型指针

    int a = 10;    //栈区
    int b = 11;
    int *pz2[2];    //这是一个内涵两个元素的数组,数组中保存着整型的指针

    pz2[0] = &a;    //数组
    pz2[1] = &b;
    printf("%d\n", *pz2[0]);
    printf("%d\n", *pz2[1]);
   

    //指针形式的字符串
    char * heart = "I love c language!";    //很重要的一点
    //首先,"I love c language!"是字符串常量,保存在静态存储区的常量区
    //而heart是指针变量,存储在栈区(地址很高),它的值是字符串常量的地址,(很低的位置)
    
    /***重要***/
    //数组形式的字符串
    char head[] = "I love c language!";
    //(1)字符串存储在静态存储区,程序启动,将字符串载入到内存中
    //(2)程序运行时,才会给数组分配内存,将静态存储区的字符串拷贝到栈区的数组中,实际上用的是一个副本
    //(3)此后编译器,便把数组名head识别位数组的首元素(&head[0])的别名,这里的head是地址常量,不可更改,(++head是不允许的)


    //字符串和二维数组
    //指针数组
    const char * mytalents[5];    //mytalents数组是一个内涵5个指针的数组,占用5*8=40个字                                    
                                  //节,    因为里面存储的是指针
    char yourtalents[5][40];        //yourtalents数组是内涵5个数组的数组,每个数组内涵40个 
                                    //char类型的值,共占用200字节

}
//指针数组:保存指针的数组

#include <stdio.h>
 
const int MAX = 3;
 
int main ()
{
   int  var[] = {10, 100, 200};
   int i, *ptr[MAX];
 
   for ( i = 0; i < MAX; i++)
   {
      ptr[i] = &var[i]; /* 赋值为整数的地址 */
   }
   for ( i = 0; i < MAX; i++)
   {
      printf("Value of var[%d] = %d\n", i, *ptr[i] );
   }
   return 0;
}

 

 

 

 

おすすめ

転載: blog.csdn.net/Vast_Wang/article/details/107747059