nimo_096
2015-05-30 09:33
采纳率: 50%
浏览 3.3k
已采纳

C语言的二维数组的值的修改

例如:char a[][7]={"foo","bar","foobar"};
想调换a[0]和a[2]的值
利用指针的话 应该用什么办法

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • 知常曰明 2015-05-30 11:03
    已采纳

    数组虽然说可以看成指针,但是可以认为它是常量指针,因此没有办法直接换指针,因此只有吧两个数组内的数据各自交换

    void swap(char *a,char *b,int n) 
    {
      for (i=0;i<n;i++)
          *a++=*b++;
    }
    void main()
    {
      char a[][7]={"foo","bar","foobar"};
        swap(a[0],a[2],7);
    }
    
    点赞 1 打赏 评论
  • CoastOfMe 2015-05-30 10:14

    a 和(a+2)

    点赞 打赏 评论
  • 零度永恒 2015-05-30 12:13

    建一个临时数组,做拷贝
    char a[][7]={"foo","bar","foobar"}, tmp[7];
    memcpy(tmp, a[0], 7);
    memcpy(a[0], a[2], 7);
    memcpy(a2], tmp, 7);

    点赞 打赏 评论
  • 零度永恒 2015-05-30 12:26

    二维数在内存中存放和一维数组一样,也 是一片连续的空间。你可以把所声明的数组理解为 a 是有 3 个元素的一维数组, 每一个元素的大小是 7 个字节。你要交换其中两个元素的值,必须要用一个临时变量来交换, 不可能通过指针来改变它元素的地址实现的。

    点赞 打赏 评论
  • TseNing 2015-05-30 12:47

    数组名代表的是该数组在内存中的首地址,*a即为a[0] 都是访问数组a[]的第一个元素。但数组名是常量指针,只能被访问 不能被修改。如果使用数组名
    做左值,编译器是会报错的。退一步讲,如果能够修改数组名的值(事实上是常量指针是不允许被修改的)让指针a指向原来的a[2],由于数组在内存中是连续存放的 那么*(a+1)便会出现意想不到的结果,它访问的不再是数组中的元素

    点赞 打赏 评论
  • ES2020 2015-05-31 00:59

    数组是常量指针,两个建立好的数组之间都是不能互相赋值的

    点赞 打赏 评论
  • Heart09 2015-05-31 03:16

    加一个&取地址符号 就行了吧

    点赞 打赏 评论
  • 天朗-星空 2015-06-01 01:28

    字符串是以‘\0’作为结束符的,所以可以修改楼上swap( )参数个数:

     #include<stdio.h>
    void swap(char *a,char *b) 
    {
        char temp =-1;
    
        do{
           temp = *a;
           *a=*b;
           *b = temp;
    
           ++a;
           ++b;
        }while(*a!='\0' && *b!='\0');//遇到两者之一结束时,终止交换
    
        if(*a=='\0'){//此时结束符未交换位置,说明字符串a先结束,只把字符串b剩余部分拷贝到字符串a位置就好
           temp = *a;
           *a=*b;
           *b = temp;//交换结束符
    
           ++a;
           ++b;
    
            do{
                *a++=*b++;
            }while(*b != '\0');//拷贝b剩余字符(结束符未拷贝)
            *a=*b;//拷贝结束符
        }
        else{//此时结束符未交换位置,说明字符串b先结束,只把字符串a剩余部分拷贝到字符串b位置就好
           temp = *b;
           *b=*a;
           *a = temp;//交换结束符
    
            do{
                *b++=*a++;
            }while(*a != '\0');//拷贝a剩余字符(结束符未拷贝)
            *b=*a;//交换结束符
        }
    
    }
    void main()
    {
      char a[][7]={"foo","bar","foobar"};
        printf("old:%-6s\t%-6s\t%-6s\n",a[0],a[1],a[2]);
        swap(a[0],a[2]);
        printf("new:%-6s\t%-6s\t%-6s\n",a[0],a[1],a[2]);
    }
    

    图片说明

    点赞 打赏 评论

相关推荐 更多相似问题