指针-C语言的二维数组的值的修改

问题描述

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

指针-C语言的二维数组的值的修改的相关文章

一个现成的二维数组,如何定义一个 指针的指针 来指向这个二维数组?

问题描述 一个现成的二维数组,如何定义一个 指针的指针 来指向这个二维数组? 例:这样一个数组,想定义一个指针的指针,指向它. int arr1[4][4] ={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; ps. 这个指针的指针 是 用来传递个函数的. 因为某种要求,需要向函数传递一个二维数组,函数的形参表中定义了 int **. 因此 这个指针的指针一定要能够传递函数,并且函数能够通过它操作二维数组元素. 解决方案 指向二维数组的

链接传参数-C语言,二维数组的元素,相同位置对应相加。求大神指教。

问题描述 C语言,二维数组的元素,相同位置对应相加.求大神指教. 两个二维数组,13列X64行,读取文件,元素相同位置对应相加,再求平均数.写出来之后,无法运行,一直都是seg fault11.还请大神指教. #include #include #include #include /*main program*/ int main() { int i,j,ave = 0; float filename1[832],filename2[832]; FILE*fp1,*fp2; /***read n

c语言-关于二维数组的输出最大值最小值以及下标的问题

问题描述 关于二维数组的输出最大值最小值以及下标的问题 int r,c; int max_i = 0,max_j = 0,min_i=0,min_j=0; int a[r][c]; int max=0,min=0; printf("请输入二维数组行(r),列(c):n"); scanf("%d%d",&r,&c); printf("请输入数据:"); for (int i=0; i<r; i++) { //输入数据 for

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 我想将二维数组每个值导出 应该怎么做呢 如下:

问题描述 for(inti=0;i<arr.GetLength(0);i++){for(intj=0;j<arr.GetLength(1);i++){xtw.WriteElementString(arr[i,j].ToString(),arr[i,j].ToString());}}我定义的是string[,]arr=newstring[7,2];现在arr是个二维数组arr[0][0]="1";arr[0][1]="11";arr[1][0]="

C语言 指针与二维数组详解_C 语言

二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩阵: 0   1   2   3 4   5   6   7 8   9  10  11 但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: C语言中的二维数组是按行排列的,也就是先存放 a[

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h>   void main(void) {     int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };     for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节     {         printf("\n%p,%d", p, *p);    

C语言数组入门之数组的声明与二维数组的模拟_C 语言

语言中指针与数组这两个概念之间的联系是密不可分的,以至于如果不能理解一个概念,就无法彻底理解另一个概念. C语言中的数组值得注意的地方有以下两点: C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来.然而,C语言中数组的元素可以是任何类型的对象,当然也可以是另外一个数组.这样,要"仿真"出一个多维数组就不是一件难事. 对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针.其他有关数组的操作,哪怕它们看上去是以数组下标进行运算的,

c二维数组名与指针的指针之间的关系

问题描述 c二维数组名与指针的指针之间的关系 int arr[3][4]; 书上说arr是指针的指针. 但是有点问题,为什么arr和arr[0]的值是一样的. 如果它是指针的指针的话,那么arr应该在一个内存空间1中存着arr[0]的地址,这个内存空间也有自己的地址. 但是这个内存空间的地址却与内存空间中存着的地址是相同的... 解决方案 arr的值本身是二维数组的首地址,它存储的内容也是数组的首地址 printf("%p %p ", arr, *arr);// 这2个值一样,它存储的

编程c语言-C语言二维数组问题 求解

问题描述 C语言二维数组问题 求解 解决方案 bool foo() { int a[100][100]; int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",a[i][j]); } } int sum = 0; int sum1 = 0; for (i = 0; i < n; i++) sum += a[i][0]; for (j = 0; j < n; j++) { sum1 = 0; for (