2 mysqljava217 mysqljava217 于 2015.05.30 17:33 提问

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

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

8个回答

gamefinity
gamefinity   Rxr 2015.05.30 19: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);
}
gamefinity
gamefinity 回复天朗-星空: 前面说了,数组是常量,没办法交换的
2 年多之前 回复
yunfenglw
yunfenglw 这个实现的好像不是字符交换,而是字符拷贝~
2 年多之前 回复
wu1yeyangguang
wu1yeyangguang   2015.05.30 20:47

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

MeOfCoast
MeOfCoast   2015.05.30 18:14

a 和(a+2)

MeOfCoast
MeOfCoast *a 和 *(a+2)
2 年多之前 回复
chaobo_lu
chaobo_lu   2015.05.30 20:13

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

chaobo_lu
chaobo_lu   2015.05.30 20:26

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

EnderSnow
EnderSnow   2015.05.31 08:59

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

henuyx
henuyx   2015.05.31 11:16

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

yunfenglw
yunfenglw   2015.06.01 09: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]);
}

图片说明

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!