c语言指针数组与二级指针应用

原代码如下,如果要通过二级指针p输出a[]中每个字符串的第二个字母,该如何修改代码?


#include<stdio.h>
int main()
{
    char *a[]={"abcd","ef","gh","ijk"};
    char **p=&a[1];
    int i;
    for(i=0;i<4;i++)
        printf("%c",**p++);
    return 0;
}

如果要通过二级指针p输出a[]中每个字符串的第二个字母,1、修改指针p指向a的第一个元素 2、 输出每个字符串的第二个字母,修改后代码:

#include <stdio.h>
int main()
{
    char *a[]={"abcd","ef","gh","ijk"};
    char **p=&a[0]; // 修改指针p指向a的第一个元素
    int i;
    for(i=0; i<4; i++)
        printf("%c",*(*(p+i)+1)); // 输出每个字符串的第二个字母
    return 0;
}


int main()
{
    char* a[] = { "abcd","ef","gh","ijk" };
    char** p = &a[0];
    int i;
    for (i = 0; i < 4; i++)
    {
        printf("%c", *(*p+1));
        p++;
    }
        
    return 0;
}

供参考:

#include<stdio.h>
int main()
{
    char* a[] = { "abcd","ef","gh","ijk" };
    char** p = a; //&a[1];  // 修改
    int i;
    for (i = 0; i < 4;p++, i++)  // 修改
        printf("%c", *(*(p)+1)); // 修改
    return 0;
}

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7610658
  • 这篇博客你也可以参考下:从整数1到99之间选出能被3整除、且有一位上的数是5的那些数,并把它们放在p数组中,输出(p数组中)满足条件的数据。
  • 除此之外, 这篇博客: (*p)指针间接赋值中的 一级指针到二级指针的推演 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 实际上所谓的值传递和地址传递都是值传递,实参传递给行参的时候都是进行一份数据的拷贝;
    如果同级指针之间进行传递,比如实参和形参都是零级指针,这时候就是最容易让人理解的值传递,大家都知道这样在被调函数里对形参的修改不会影响实参;同理如果实参和形参都是一级指针,在被调函数里又没有通过*进行间接修改的话,被调函数的修改也不会影响主调函数的实参;
    对于被调函数能否修改主调函数实参的内容,关键是看在被调函数里是否存在使用*进行间接访问,或者存在数组的下标访问,这两种访问都是一种间接访问的方式。
    如果想修改一级指针的值,那么形参要用二级指针;

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int  getMem3(char **myp1, int *mylen1,  char **myp2, int *mylen2)
    {
        int     ret = 0;
        char    *tmp1, *tmp2;
    
        tmp1 = (char *)malloc(100);
        strcpy(tmp1, "1132233");
    
        //间接赋值 
        *mylen1 = strlen(tmp1);  //1级指针
        *myp1 = tmp1; //2级指针的间接赋值
    
        tmp2 = (char *)malloc(200);
        strcpy(tmp2, "aaaaavbdddddddd");
        *mylen2 = strlen(tmp2);  //1级指针
        *myp2 = tmp2; //2级指针的间接赋值
        return ret;
    }
    
    int  main()
    {
        int     ret = 0;
        char    *p1 = NULL;
        int     len1 = 0;
        char    *p2 = NULL;
        int     len2 = 0; 
    
        ret = getMem3(&p1, &len1, &p2, &len2);
        if (ret != 0)
        {
            printf("func getMem3() err:%d \n", ret);
            return ret;
        }
        printf("p1:%s \n", p1);
        printf("p2:%s \n", p2);
        if (p1 != NULL)
        {
            free(p1);
            p1 = NULL;
        }
        if (p2 != NULL)
        {
            free(p2);
            p2 = NULL;
        }
        printf("p1:%d \n", p1);
        system("pause");
        return ret;
    }