moc 发表于 2018-8-18 14:04:23

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]
查看完整版本: 014-指针数组的用法