014-指针数组的用法
本帖最后由 moc 于 2018-8-18 21:41 编辑1、sizeof + 数组名, 指向数组元素的指针, 指向数组类型的指针
注意:虽然下面a和pp1,b和pp2的大小和类型都是一样的,但代表的含义不太一样,所以sizeof的结果是不一样的。
int a;
printf("a的大小:%d\n", sizeof(a)); //40
int *pp1= a;
printf("pp1的大小:%d\n", sizeof(pp1));//4
int b;
printf("b的大小:%d\n", sizeof(b));//80
int(*pp2) = b;
printf("pp1的大小:%d\n", sizeof(pp2));//4
2、指针数组--求关键字在表中的位置
int searcheKeyTable(const char* table[], const int size, const char* key, int *pos)
{
int rv = 0;
int i = 0;
int inum = 0;
if (table == NULL || key == NULL || pos == NULL)
{
rv = -1;
printf("func searcheKeyTable:%d", rv);
return rv;
}
inum = (sizeof(table) / sizeof(*table)); // 数组做函数参数会退化为指针,此时结果为1
for (i = 0; i<size; i++)
{
if (strcmp(key, table) == 0)
{
*pos = i;
return rv;
}
}
//没有找到返回-1
if (i == size)
{
*pos = -1;
}
return rv;
}
#define DIM(a) (sizeof(a)/sizeof(*a))// 带参的宏(机械替换即可)
//DIM(c_keyword)===>(sizeof(c_keyword)/sizeof(*c_keyword))
int main()
{
int inum = 0;
int pos = 0;
int a;
int i = 0;
char* c_keyword[] = {
"while",
"case",
"static",
"do",//编译器会把字符串的首地址存入指针数组
0 // 编译器直接把0存入指针数组,0即NULL, 加在最后指针数组的最后一个指针的值为NULL ,可用于判断数组结束
};
for (i = 0; c_keyword != NULL; i++)
{
printf("%s\n", c_keyword);
}
inum = (sizeof(c_keyword) / sizeof(*c_keyword)); //指针数组未退化前 inum = 4
searcheKeyTable(c_keyword, DIM(c_keyword), "do", &pos);
//searcheKeyTable(c_keyword, inum, "do", &pos);
printf("pos:%d\n", pos);
searcheKeyTable(c_keyword, DIM(c_keyword), "static", &pos);
printf("pos:%d\n", pos);
getchar();
return;
}
3、main函数的参数
main函数是操作系统调用的函数;在程序执行的时候由操作系统向main函数传递参数。
argc 命令行参数
argv 命令行参数数组
env函数变量数组
测试代码:
int main(int argc, char* argv[], char* env[])
{
int i = 0;
printf("agc:%d\n\n\n", argc);
printf("******************* Begin argv *******************\n");
for (i = 0; i<argc; i++)
{
printf("%s\n", argv);
}
printf("******************* End argv *******************\n");
printf("\n\n\n");
printf("******************* Begin env *******************\n");
for (i = 0; env != NULL; i++)
{
printf("%s\n", env);
}
printf("******************* End env*******************\n");
getchar();
}
页:
[1]