指针的赋值,字符串的空间分配

img


循环里的temp

img


怎么写这个

这是要问几个啊
arr是二维数组,有5行,从arr[0]到arr[4],arr[5]就是二维数组arr内存块之后的第一个字节地址----这段能理解吗? 这个不理解,就麻烦了
如果理解了,那么for(int i=0;i<5;i++) * temp = * (arr+i);这里就是将temp指针指向arr二维数组的每一行。
显然这个temp指针地址一定是小于arr[5]这个地址的----这个理解吧?因为arr[5]是二维数组之后的地址
然后内循环每次就是从arr的第0行,第1行,第2行,一直到第4行开始,逐个元素赋值到二维数组的最后一个元素。---这个能理解?
那么从第0行开始赋值的话,一共5*5=25个元素,自然就是从0到24,因此第0行就是0-4,可以理解?赋值一遍后,x是多少?是不是24?
然后从第1行开始赋值的话,一共5 * 4=20个元素,就是从25-44,因此第1行就是25-29,可以理解吗?x一直在增加啊
然后继续第2行,和上面规律一样。。。。

#include<stdio.h>
int main(int argc,char **argv){
    int arr[5][5]={0}; // 初始全为0
    int a = 0;
    for(int i=0;i<5;i++)
    {
        int *temp = *(arr+i);  // 第n次 temp->a[n]
        // 第一次temp的地址为arr[0][0], temp++ 以后temp地址变为arr[0][1]
        // 当temp地址为arr[0][4]时,再temp++ temp地址变为 arr[1][0]....以此类推
        // 当temp为arr[4][4]时,再temp++ 才为 arr[5]头节点的位置
        // 所以第一遍循环结束,arr[5][5]的数据为 0~24
        // 你可把i<5 改成i<1,看看循环只就行一遍,arr[5][5]每个数到底是什么
        for(;temp<arr[5];temp++){
            *temp = a++;
        }
    }

    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            printf("%d\t",arr[i][j]);
        }
        putchar('\n');
    }
    return 0;
}

#include <stdio.h>
#include <stdlib.h>

char *convertAndMerge(char s[2][20]);

int main(void)
{
    char words[2][20] = {"Welcome to Xiyou ","Linux Group 2022"};
    printf("%s\n",words[0]);
    printf("%s\n",words[1]);
    char *str = convertAndMerge(words);
    printf("str = %s\n",str);
    free(str);
}

char *convertAndMerge(char s[2][20]) {
    char *key = (char*)malloc( 50*sizeof(char));
    int len = 0;
    for(int z=0;z<2;z++){
        for(int z1=0;s[z][z1]!='\0';z1++){
          key[len] = s[z][z1];
          len+=1;
        }
    }
    key[len] = '\0'; // 记得加上结束符
    return key;
}

img

解答如下

img

#include <stdio.h>
#include <stdlib.h>

//请实现ConvertAndMerge函数∵
//拼接输入的两个字符串,并翻转拼接后得到的新字符串中所有字母的大小写。提示:你需要为新字符串分配空间。
char* convertAndMerge(char words[2][20]);
int main(void){
    char words[2][20] = {"welcome to Xiyou ", "Linux Group 2022"};
    printf( "%s\n", words[0]);
    printf( "%s\n", words[1]);
    char *str = convertAndMerge(words);
    printf ( "str = %s\n", str) ;
    free(str);
}
char* convertAndMerge(char words[2][20])
{
    int n=2;
    char *str=(char*)malloc(n*20);
    int p=0;
    for(int i=0;i<n;i++)
    {
        
        }
    }
    return str;
}

二维数组的数组元素在内存是连续排列的,代码中内层循环的意思是用temp指针遍历二维数组中从arr[i]位置到arr[5]位置之间的所有数组元素。
i=0时,temp从arr[0]到arr[5],遍历了25个数组元素,每个元素依次被赋值为0,1,2,3,4,5,6, ..., 23, 24
i=1时,temp从arr[1]到arr[5],遍历了20个数组元素,从arr[1]开始的元素依次被赋值为25,26,27,...,44
依次类推