整形二维数组与字符串二维数组
————————————的比较研究
概述:
研究整形二维数组与字符串二维数组在输出的时候表现为不同的情况。
步骤1、整形二维数组
--整形二维数组
#include "iostream"
using namespace std;
int main(void)
{
int scar[3][6]={{1,2,3,4,5,6},{2,3,4,5,6,7},{3,4,5,6,7,8}};
for(int i=0;i<3;i++)
{
cout<<scar[i]<<endl;//这样输出的是每行的地址
for(int j=0;j<6;j++)
{
cout<<scar[i][j]<<endl;//这里输出的是每行的元素
}
}
return 0;
}
以下是整形二维数组的输出显示
可以看出每当运行到"cout<<scar[i]<<endl;"的时候输出的是一个地址,第一个地址与第二个地址相差0x18,第二个地址与第一个地址相差0x18,在这里“scar[i]”是每个一维数组的指针。
猜想:
上面每两个连续指针之间相差都是0x18,就是24个字节,6个整形数字,每个整形数字占用4个字节
尝试:直接使用“scar[i]”作为指针,输出一维数组中的元素,由于1.,2,3地址相差相同,所以所有的元素都是连续存放的,可以全部使用scar[i]作为引用完整的输出全部元素
#include "iostream"
using namespace std;
int main(void)
{
int *p,scar[3][6]={{1,2,3,4,5,6},{2,3,4,5,6,7},{3,4,5,6,7,8}};
for(int i=0;i<3;i++)
{
cout<<scar[i]<<endl;//这样输出的是每行的地址
p=scar[i];
for(int j=0;j<6;j++)
{
cout<<*p++<<endl;//这里输出的是每行的元素
}
}
return 0;
}
输出截图:
通过以上的两次输出截图比较可知,系统分配给程序的内存是动态内存,只要首先找到的一段内存可以满足程序的需求,就有可能被分配给相应的程序。
*******************************
步骤2、二维字符数组的研究
分为两种情况,
情况一、在每一维字符数组中不使用字符串截止符 “\0”,
#include "iostream"
using namespace std;
int main(void)
{
char scar[3][6]={{'1','2','3','4','5','6'},{'2','3','4','5','6','7'},{'3','4','5','6','7','8'}};//二维字符数组
for(int i=0;i<3;i++)
{
cout<<scar[i]<<endl;
for(int j=0;j<6;j++)
{
cout<<scar[i][j]<<endl;//这里输出的是每行的元素
}
}
return 0;
}
输出如下:
可以看出,第一次运行语句"cout<<scar[i]<<endl;"的时候输出的是全部的字符,直到最后遇见截止符“\0”才停止输出,在这里每个“scar[i]”,是相应的一维数组的指针。
情况二,在每个一维数组中使用字符串截止符“\0”
#include "iostream"
using namespace std;
int main(void)
{
char scar[3][7]={{'1','2','3','4','5','6','\0'},{'2','3','4','5','6','7','\0'},{'3','4','5','6','7','8','\0'}};//二维字符数组
for(int i=0;i<3;i++)
{
cout<<scar[i]<<endl;
for(int j=0;j<6;j++)
{
cout<<scar[i][j]<<endl;//这里输出的是每行的元素
}
}
return 0;
}
输出截图
通过与第一种情况截图比较,第二种情况更能准确的输出字符串,
结论:
第一条:通过整形二维数组和字符二维数组的输出结果截图比较可知,二维数组在内存中是连续存放的,每次"scar[i]"指向的是每个一维数组的起始。
第二条:在整形数组输出的时候“scar[i]”输出的是一个内存地址,而在二维字符数组输出的是从“scar[i]”开始往后一直到遇到字符串截止符“\0”为止,这样输出的时候不安全,会出现乱码,有可能形成软件漏洞。
第三条:通过两种二维字符数组的输出比较,在使用多维字符数组的时候最好在一维数组中使用字符串截止符“\0”,这样的话会比较安全。输出的时候也比较准确。