问题描述
- C语言的二维数组的值的修改
-
例如:char a[][7]={"foo","bar","foobar"};
想调换a[0]和a[2]的值
利用指针的话 应该用什么办法
解决方案
数组虽然说可以看成指针,但是可以认为它是常量指针,因此没有办法直接换指针,因此只有吧两个数组内的数据各自交换
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);
}
解决方案二:
数组名代表的是该数组在内存中的首地址,*a即为a[0] 都是访问数组a[]的第一个元素。但数组名是常量指针,只能被访问 不能被修改。如果使用数组名
做左值,编译器是会报错的。退一步讲,如果能够修改数组名的值(事实上是常量指针是不允许被修改的)让指针a指向原来的a[2],由于数组在内存中是连续存放的 那么*(a+1)便会出现意想不到的结果,它访问的不再是数组中的元素
解决方案三:
a 和(a+2)
解决方案四:
建一个临时数组,做拷贝
char a[][7]={"foo","bar","foobar"}, tmp[7];
memcpy(tmp, a[0], 7);
memcpy(a[0], a[2], 7);
memcpy(a2], tmp, 7);
解决方案五:
二维数在内存中存放和一维数组一样,也 是一片连续的空间。你可以把所声明的数组理解为 a 是有 3 个元素的一维数组, 每一个元素的大小是 7 个字节。你要交换其中两个元素的值,必须要用一个临时变量来交换, 不可能通过指针来改变它元素的地址实现的。
解决方案六:
数组是常量指针,两个建立好的数组之间都是不能互相赋值的
解决方案七:
加一个&取地址符号 就行了吧
解决方案八:
字符串是以‘’作为结束符的,所以可以修改楼上swap( )参数个数:
#include<stdio.h>
void swap(char *a,char *b)
{
char temp =-1;
do{
temp = *a;
*a=*b;
*b = temp;
++a;
++b;
}while(*a!='' && *b!='');//遇到两者之一结束时,终止交换
if(*a==''){//此时结束符未交换位置,说明字符串a先结束,只把字符串b剩余部分拷贝到字符串a位置就好
temp = *a;
*a=*b;
*b = temp;//交换结束符
++a;
++b;
do{
*a++=*b++;
}while(*b != '');//拷贝b剩余字符(结束符未拷贝)
*a=*b;//拷贝结束符
}
else{//此时结束符未交换位置,说明字符串b先结束,只把字符串a剩余部分拷贝到字符串b位置就好
temp = *b;
*b=*a;
*a = temp;//交换结束符
do{
*b++=*a++;
}while(*a != '');//拷贝a剩余字符(结束符未拷贝)
*b=*a;//交换结束符
}
}
void main()
{
char a[][7]={"foo","bar","foobar"};
printf("old:%-6st%-6st%-6sn",a[0],a[1],a[2]);
swap(a[0],a[2]);
printf("new:%-6st%-6st%-6sn",a[0],a[1],a[2]);
}
时间: 2024-08-03 14:14:19