关于指针的理解(一)

2024-06-06  本文已影响0人  爱学习的猫叔

一级指针和二级指针的简单理解

/*
 传入一个常量二级指针,指针指向的变量值无法修改,指针地址可以改
*/
void fun(const char** str) {
    *str = "Android";
    //此时解引用输出的是一级指针的地址值,但此时该地址值被赋值成常量"Android"的地址
    printf("fun addr=%d\n",*str);//853191864
}

void print(char** strs,int len) {
    int i;
    for (int i = 0; i < len; i++)
    {
        printf("%s\n",*(strs+i));
    }
}

void main() {
    const char* name = "HelloWorld";
    const char** temp = &name;
    //比较二级指针&name与temp的地址
    printf("main addr1=%d\n",&name);//-2031093112
    printf("main addr2=%d\n",temp);//-2031093112
    //修改一级指针的地址值
    fun(&name);
    //打印一级指针修改后的地址值
    printf("main name=%d\n", name);//853191864
    //在C语言中,%s格式说明符用于打印字符串,它会打印从指定位置开始直到遇到字符串结束符\0为止的所有字符。
    //因此,当你使用printf("main name1=%s\n", name);时,它会打印整个字符串"HelloWorld",而不仅仅是第一个字符'H'。
    printf("main name1=%s\n", name);//Android
    printf("main name2=%d\n", "Android");//853191864
    //如果你只想打印第一个字符
    printf("main name3=%c\n", name[0]);//A
    //遍历字符串
    int index;
    for (index = 0; index < strlen(name); index++)
    {
        //char c = name[index];
        char c = *(name+index);
        printf("%c\n",c);
    }

    const int num = 100;

    const int* numP = &num;
    printf("numP=%d\n", *numP);
    //常量指针无法修改指针指向的值
    //*numP = 200;
    int num2 = 300;
    //但可以修改指针地址
    numP = &num2;
    printf("numP=%d\n",*numP);

    //指针常量无法修改指针地址
    int* const numQ = &num2;
    printf("numQ=%d\n", *numQ);
    //但可以修改指针指向的值
    *numQ = 400;
    printf("numQ=%d\n", *numQ);
    printf("num2=%d\n", num2);
    
    //双常量,就是指针地址和指针地址所指向的值都不能改
    const int* const numR = &num2;
    printf("numR=%d\n",*numR);


    /*二维数组*/
    int len = 3;
    char** params =(char**)malloc(sizeof(char*)*len);
    int i;
    for (i = 0; i < len; i++)
    {
        params[i] = (char*)malloc(sizeof(char) * 100);
        sprintf(params[i],"i=%d",i);
    }

    print(params, len);

    for (i = 0; i < len; i++)
    {
        if (params[i]!=NULL)
        {
            free(params[i]);
            params[i] = NULL;
        }
    }

    if (params != NULL)
    {
        free(params);
        params = NULL;
    }

    getchar();
}
上一篇下一篇

猜你喜欢

热点阅读