指针数组(二级指针的第一种内存模型)
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语言提高24】二级指针做输入的第一种内存模型:数组指针
- C提高_day03_二级指针做输入第2种内存模型
- C语言 二级指针内存模型混合实战
- 二级指针的3种内存模型
- 二维数组(二级指针的第二种内存模型)
- 二级指针的三种内存模型
- 二级指针的三种内存模型的整理与分析
- 04二级指针三种内存模型
- C提高_day03_二级指针做输入第3种内存模型
- 二级指针第三种内存模型的结束标志
- day4_二级指针的内存模型
- C语言 二级指针内存模型③
- 二级指针做输入_第二种内存模型
- 二级指针的第三种内存模型
- 【C语言提高25】二级指针做输入的第二种内存模型:二维数组
- 二级指针做输入的第一种模型
- 二级指针输入模型(三种内存模型)
- C语言中的二级指针的三种内存模型
- 二级指针的三种内存模型
- C——提高(2)字符串一级指针、二级指针内存模型