指针经典题_1

学会自己细化指针方面的具体操作
下面是一道题。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//要求:利用一个func函数,访问下列数组中的元素,并且将能够修改的元素打印出来。
//自己做到的仅仅只是,利用一个函数对字符数组进行访问和修改
int main()
{
    int i,j;
    printf("改变前的是:\n");
    char str1[] = "aaarr1";
    printme(str1);
    char str2[] = "aaaaarr2";
    printme(str2);
    char str3[] = "aaaarr3";
    printme(str3);
    char str4[] = "aaaaaarr4";
    printme(str4);
    char str5[] = "aaarr5";
    printme(str5);
    char str6[] = "arr6";
    printme(str6);
    printf("改变后的:\n");
    change(str1,strlen(str1));
    change(str2,strlen(str2));
    change(str3,strlen(str3));
    change(str4,strlen(str4));
    change(str5,strlen(str5));
    change(str6,strlen(str6));
    printf("str1-str6改变完成\n");
    char* a[][3] = {str1,str2,"aaaarr3",str4,str5,str6};*("aaaarr3"+2);
    char* b[][3] = {"bb2222","bb2","bb3","bb4","bb5","bb6","bb7","bb8","bb9"};
    char* c[][3] = {"cc","cc","cc"};
   /* printf("c开始\n");
    for(i = 0; i < strlen(c)/strlen(c[0]);i++)
    {
        for(j = 0; j < strlen(c[0]);j++)
            printf("%s\t",c[i][j]);
        printf("\n");
    }
    printf("c完成!\n");*/
    //printf(* b[1]);
    char*(*arr[])[3]={a,b,c};//*(p+i) == a
    
    changePrint(arr,3,2,3,1);
    return 0;
}

void printme(char * str)
{
    printf("%s\n",str);
}
void change(char * str, int n)
{
    int i = 0;
    for(i = 0; i < n; i++)
    {
        *(str+i) = 't';
    }
    printf("%s\n",str);
    n = 0;
    i = 0;
}

而正确的方式应该是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void changePrint( char*(*(*p))[3],int arrLen,int aLen,int bLen,int cLen )
{
    int i;//控制1层,arr
    int jRow,jCol;//控制2层,abc
    int k;//控制3层,str1-str6
    //打印所有字符串
    int len[3] = {aLen,bLen,cLen};
    for(i = 0;i<arrLen;i++)//(p+i)
    {
        //printf("%p\n",*(p+i));//访问arr每个元素
        for(jRow = 0;jRow<len[i];jRow++) //*(p+i)+jRow
        {
            for(jCol = 0;jCol<3;jCol++)//*(*(p+i)+jRow)+jCol
            {

                printf( "%s\t",*(*(*(p+i)+jRow)+jCol));//元素的值是字符串地址

            }
         /*char*   *(*(*(p+i)+jRow)+jCol); "abcdefg";
            *(*(*(*(*(p+i)+jRow)+jCol))+1);
            *(*(*(*(p+i)+jRow)+jCol)+1);*/
            printf("\n");
        }
        printf("\n");
    }

    //获取str长度
    int lenstr[6];
    for(i = 0;i<1;i++)
    {
        k = -1;
        for(jRow = 0;jRow<2;jRow++)
        {
            for(jCol = 0;jCol<3;jCol++)
            {
                    k=k+1;//k的值每次加1,总共加6次,加到5为止,即作为数组的lenstr的第六个元素
                    lenstr[k] = strlen((*(*(*p+jRow)+jCol)));//获取str1-str6数组的长度,并且赋给数组lenstr,方便后期的修改操作
                    //注意:此处犯的错误是,先选择了用sizeof()来测试数组长度,导致的结果是在下面的修改str1-str6里面的字符,仅仅只是修改了前四个
                    /*printf("**************\n");
                    printf("%d\n",lenstr[k]);//此处是用来测试我们所获取的长度,并打印出来
                    printf("**************\n");*/
            }
        }

    }
    //修改str1-str6的字符串
    int m = 0;
    //int len[3] = {aLen,bLen,cLen};
    for(i = 0;i<1;i++)//a
    {
        k = -1;       
        for(jRow = 0;jRow<len[i];jRow++) //a[0]
        {
            for(jCol = 0;jCol<3;jCol++)//a[0][0]
            {
                k = k+1;//6次
                for(m = 0; m < lenstr[k]; m++)//依次访问lenstr里面的每一个数字,也就是str1-str6的长度
                    *(*(*(*(p+i)+jRow)+jCol)+m) = 't';//将str1-str6里面的每一个字符改为t
            }
        }
    }
    //修改后打印所有字符串
    for(i = 0;i<arrLen;i++)//(p+i)
    {
        //printf("%p\n",*(p+i));//访问arr每个元素
        for(jRow = 0;jRow<len[i];jRow++) //*(p+i)+jRow
        {
            for(jCol = 0;jCol<3;jCol++)//*(*(p+i)+jRow)+jCol
            {
               // *(*(p+i)+jRow)+jCol   元素的地址
                printf( "%s\t",*(*(*(p+i)+jRow)+jCol));//元素的值是字符串地址
            }
            printf("\n");
        }
        printf("\n");
    }

}
int main()
{
    char str1[] = "aaarr1";
    char str2[] = "aaaaarr2";
    //printf("str2:%d\n",sizeof(str2));
    char str3[] = "aaaarr3";
    char str4[] = "aaaaaarr4";
    char str5[] = "aaarr5";
    char str6[] = "arr6";
    char* a[][3] = {str1,str2,str3,str4,str5,str6};
    //printf("%d\n",size((*((a+1)+1)));
    char* b[][3] = {"bb2222","bb2","bb3","bb4","bb5","bb6","bb7","bb8","bb9"};
    //printf("%d\n",strlen(**b));
    char* c[][3] = {"cc","cc","cc"};
    char*(*arr[])[3]={a,b,c};//*(p+i) == a
    changePrint(arr,3,2,3,1);
    return 0;
}

运行结果

上面的程序,遇到的问题是:学会分析,逐步进行分析,先有逻辑上的思维。然后逐步细化过程。实现访问是大哥讲解的,后面自己在实现修改的过程中,同样遇到了问题,困扰自己的是获取里面数组长度,刚开始全部采用的是sizeof(),因此仅仅只能修改前四个,而后面改为strlen()来获取数组长度时,才知道问题所在。先梳理逻辑,再进一步实现功能。
上述的程序只是初稿,在我看来,还有可以优化的可能性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值