您的位置:首页 > 编程语言 > C语言/C++

指针数组(二级指针的第一种内存模型)

2014-08-05 22:36 726 查看

指针数组(二级指针的第一种内存模型)

由指针数组的一个应用讲起

先讲一个知识点(指针数组的一个应用),暂时不用管它的原理,只需要知道有这样的用法即可。

/*
argc 命令行参数
argv 命令行参数数组
env 函数变量数组

int main();
int main(int argc);
int main(int argc, char *argv[])
*/

干活要注意是在哪个框架下干活。
//是别人把资源创建好,传递给你
//操作系统(内核)、框架cocos2d-x等给你分配好资源

int main(int argc, char* argv[], char* env[])
{
int i = 0;
//main02_1();

printf("******************* Begin argv *******************\n");
for(i=0; i<argc; i++)
{
printf("%s\n", argv[i]);
}

// for(i=0; argv[i]!=NULL; i++)
// {
// printf("%s\n", argv[i]);
// }
printf("******************* End argv *******************\n");

printf("\n");
printf("\n");
printf("\n");

printf("******************* Begin env *******************\n");

for(i=0; env[i]!=NULL; i++)
{
printf("%s\n", env[i]);
}

printf("******************* End env*******************\n");

getchar();
}

运行结果如下:





前面一部分输出的是本执行文件的路径,后面一部分输出的是环境变量。

环境变量查看方式是:我的电脑>>>高级>>>环境变量。

另外本视频(F:\Cpp_ChuanZhi\C_day0319_数组和指针\day04-总结\06-2干活要注意是在那个框架下干活)Master还演示了再dos界面下运行可执行文件的方法,可是我自己在我的电脑上却操作不了,估计还是那个环节搞得不对吧,暂时先放着吧,以后再说。

 

 

如何理解指针数组和数组指针

在实例中学习,请看下面代码

int main()
{
//char a[5]; //定义一个数组,并指定其长度是。
//char a[]; //定义一个数组,只不过没有指定其长度而已。
//char* a[]; //定义一个指针数组,也没有指定其长度。
char* c_keyword[] =
{
"while",
"case",
"static",
"do",
};
char cArray[10][30]; //定义一个二维数组
char (*paa)[30] = cArray;//定义一个指向二维数组的指针(数组指针),30是步长。
}
助记:怎样区分指针数组和数组指针?

数组指针首先是一个指针,这是因为()的优先级和[]相同,但是其结合方向是从左向右的,所以优先取指针(*paa)。

 

随即讲一个知识点:一个入口多个出口容易造成内存泄露

看下面一个例子(指针数组的一个应用)

//函数功能:求关键字在表中的位置
int searcheKeyTable(const char* table[], const int size, const char* key, int *pos)
{
int rv = 0;
int i = 0;
if (table==NULL || key==NULL || pos==NULL)
{
rv = -1;
printf("func searcheKeyTable:%d\n", rv);
return rv;
}
//如果在这里malloc了一些内存(free是放在函数最后的),紧接着在下面的for循环中就return了,那么这些malloc的内存就永远也找不到了(操作系统不会主动回收malloc的内存),即造成内存泄露。
for(i=0; i<size; i++)
{
if( strcmp(key, table[i]) == 0 )
{
*pos = i;
//break;
return rv;
}
}

//如果没有找到,则返回-1
if (i == size)
{
*pos = -1;
}
return rv;
}

#define DIM(a) (sizeof(a)/sizeof(*a))
int main()
{
int pos = 0;
int a[10];
int i = 0;
char* c_keyword[] = {
"while",
"case",
"static",
"do",
};
//==========================================
//若要使用这种方式来输出,则数组的最后一个元素必须为0。
//但是数组的最后一个元素若为0的话,则在下面用searcheKeyTable()函数中的判断条件则应该改变了。
for (i=0; c_keyword[i]!=NULL;i++)
{
//printf("%s \n", c_keyword[i]);
}
//==========================================
printf("sizeof(a):%d\n", sizeof(a)); //10*4
printf("sizeof(c_keyword):%d\n", sizeof(c_keyword)); //20
printf("sizeof(*c_keyword):%d\n", sizeof(*c_keyword)); //4,相当于char *
searcheKeyTable(c_keyword, DIM(c_keyword), "do1", &pos);
printf("pos:%d\n", pos);
getchar();
return ;
}
说明

//[]和* 区别是,[]只不过是编译器帮我们做了一个*p操作而已。(me:这么说若是用[],则编译器在编译的时候就已经取到内存中的值了。但是我感觉不对劲啊,因为当[]中的变量i是变化的,这个i的值在每次运算过程中会得到不同的值,以至于取得内存中的值也不同,这个在编译阶段如何做得了?)
for (i=0; c_keyword[i]!=NULL;i++) //c_keyword[i]相当于*(c_keyword+i),这是要读取内存中的值。所以在初始化c_keyword时,如果没有将其最后一个值初始化为,则这里for循环中的判断将会读取数组以外的值。
{
printf("%s \n", c_keyword[i]);
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C C++