二级指针内存模型

来源:互联网 发布:10天学会单片机百度云 编辑:程序博客网 时间:2024/05/17 23:14

第一种内存模型

#include<iostream>#include<string>#include<stdlib.h>#include<stdio.h>/*二级指针内存模型*/using namespace std;/*第一种内存模型*/void printarray1(char **str)//实参*str[]退化成**str{             char * temp = NULL;//temp是在栈区申请的一个指针变量    for( int i = 0;i<5;++i)            {                         for(int j = i+1;j<5;++j)                        {                                     if(*str[i]>*str[j])//如果str[i][0]大于str[j][0]                                    {                                                temp = str[i];//指针str指向的地址赋3值给temp                                                str[i] = str[j];//指针str指向的地址赋3值给str                                                str[j] = temp;//指针temp指向的地址赋3值给str                                    }                        }            }}void main1()   //第一种内存模型 char *str[]{             char * str[] = {"1111" ,"4444", "3333","2222" ,"5555"}; // 指针数组:str是一个存放5个指针变量的数组,这5个指针变量在栈区申请。每一个指针变量str[i]指向一个常量内存块,该内存块里面存放“1111”            cout<< sizeof(str)<<endl;//大小为20,每个指针大小为4,str指针数组里面有5个指针            cout<< "before select:"<<endl;             for(int i = 0;i<5;++i)            {                        cout<<str[i]<<endl;            }            printarray1(str);            cout<< "after select:"<<endl;             for(int i = 0;i<5;++i)            {                        cout<<str[i]<<endl; //依次输出5个指针变量指向的地址的内容,指针变量的顺序已改变            }            system( "pause");}

这里写图片描述

第二种内存模型

/*第二种内存模型*///实参str退化成p[5][5]//p实际上是一个指向数组的数组指针 对p[i]进行操作相当于对str[i]进行操作void printarray2(char p[5][5]){             char buf[5];//在栈区申请5个char单位的内存             for(int i = 0;i<5;++i)            {                         for(int j = i+1;j<5;++j)                        {                                     if(p[i][0]>p[j][0])                                    {                                                strcpy(buf,p[i]);                                                strcpy(p[i],p[j]);                                        strcpy(p[j],buf);                                    }                        }            }}void main2()  //第二种内存模型 str[][5]{             char str[][5] = {"1111" ,"4444", "3333","2222" ,"5555"}; //从栈区申请一段4*5的内存块            cout<< sizeof(str)<<endl;//str的大小为20 20*1            cout<< "before select:"<<endl;             for(int i = 0;i<5;++i)            {                        cout<<str[i]<<endl;            }            printarray2(str);            cout<< "after select:"<<endl;             for(int i = 0;i<5;++i)            {                        cout<<str[i]<<endl;            }            system( "pause");}

这里写图片描述

第三种内存模型

/*第三种内存模型*/void printarray3(char **p){             char buf[5];//在栈区申请一段内存             for(int i = 0;i<10;++i)            {                         for(int j = i+1;j<10;++j)                        {                                     if(*p[i]<*p[j])//比较str[i][0]和str[j][0]                                    {                                                strcpy(buf,p[i]); //交换指针buf和str[i]指向的地址                                                strcpy(p[i],p[j]); //交换指针str[i]和str[j]的地址                                                strcpy(p[j],buf); //交换指针str[j]和buf的地址                                    }                        }            }}void main3(){             char ** str = new char *[10]; //在栈区申请一个指针变量str,在堆区申请一段内存,里面存放了10个char型指针。str指向这a一段内存             for(int i = 0;i<10;i++)            {                        str[i] = new char [10];//str[i]是一个指针,在堆区申请了10个char型单位内存。str[i]指向这a一段内存                        sprintf(str[i], "%d%d%d",i,i,i); //把"%d%d%d",i,i,i打印到str[i]里            }            cout<< "before select:"<<endl;             for(int i = 0;i<10;i++)            {                        cout<<str[i]<<endl;            }    printarray3(str);            cout<< "after select:"<<endl;             for(int i = 0;i<10;i++)            {                        cout<<str[i]<<endl;            }    for( int i = 0;i<10;i++)            {                         delete str[i];//释放str[i]指向的那一段内存            }             if(str!=NULL)                         delete str;//释放str指向的那一段内存            system( "pause");

这里写图片描述
对参数的指针类型应该怎么理解,理解的角度需要从两个角度出发
第一个角度:站在编译器的角度 对形参,如果是指针类型,编译器只会把它当作一个指针变量来看。(分配四个自己的内存)
第二个角度:我们只有在使用指针所指向的内存空间的时候,我们才去关心内存是一维的,还是二维的

0 0