数组之间的直接赋值,就是直接用 arr1=arr2 ? ----> 这种方式必然是不可行的

因为数组名是指针常量,是不可修改的左值。所以这种直接赋值必然是不可行的。

   (  --  不清楚数组名是指针常量可以看:常量指针,指针常量  -- )

拓展:左值=右值(称为赋值)。其中左值是变量,右值既可以是变量也可以是数值。

一、数组之间赋值方法

1. arr[i] = arr2[i]

#include<stdio.h>
int main()
{
    char arr1[5] = { 'a','b','c','d','e'};
    char arr2[5] = { 0 };
    for (int i = 0; i < 5; i++)
    {
        arr2[i] = arr1[i];
    }
    for (int j = 0; j < 5; j++)
    {
        printf("%c", arr2[j]);
    }
    return 0;
}

 适用于任何数据

2.  *(arr2+i) = *(arr1+i)

#include<stdio.h>
int main()
{
    int arr1[5] = { 1,2,3,4,5 };
    int arr2[5] = { 0 };  
    for (int i = 0; i < 5; i++)
    {
        *(arr2+i) = *(arr1+i);
    }
    for (int j = 0; j < 5; j++)
    {
        printf("%d ", *(arr2+j));
    }
    return 0;
}

 适用于任何数据

3. strcpy拷贝 

#include<stdio.h>
int main()
{
    char arr1[10] = { "abcde" };
    char arr2[10] = { 0 };
    strcpy(arr2, arr1);
    printf("%s", arr2);
    return 0;
}

只能用于字符串拷贝 -- 因为strcpy需要读取字符串中的'\0'作为结束标志,可以跟第一个对比

4. memcpy 

#include<stdio.h>
int main()
{
    int arr1[6] = { 1,2,3,4,5,6 };
    int arr2[6] = { 0 };
    memcpy(arr2, arr1, sizeof(arr1));
    for (int i = 0; i < 6; i++)
    {
        printf("%d ", arr2[i]);
    }
    return 0;
}

 适用于任何数据

 

二、实例分析

模拟实现strcpy字符串拷贝过程中,就需要实现arr1,arr2之间的赋值。截取其中案例如下:

 思考:这四种赋值是否都可行?

分析:   先看优先级,再看是否直接赋值。具体如下...

“*和++”两者优先级是相同的,需要按从右到左的顺序执行。但是由于后置++,最后才++。

所以后置++的时候,可以将++看成是最低级的。

例如:*P++可看成*(P++),即先执行p++,后执行*p,但由于这里的“++”号是后加加号,所以会在整条语句执行完后再对P自加一,所以最终的实际执行效果等效为:

先执行(*P)操作,后P自加,换种例子介绍,即是:e.g (--P++)等价于 --(P++)实际执行效果等价于 先 p=p-1 后 p=p+1等价于(--p)++。

数组之间不能直接赋值,即arr1=arr2是不允许的。

①arr1[i]++ = arr2[i]++中,由于是后置++,所以先完成整个表达式的计算,再++。这个表达式先计算的是arr1=arr2

②arr1++ = arr2++其实就是数组之间的赋值

以上两个都存在数组之间的赋值 ,数组是不可修改的左值,所以错误,不可行

③*arr1++ = *arr2++,因为是先*arr1=*arr2,数组之间不能赋值,但是指针之间是可行的。

④arr1[i] = arr2[i],变量之间赋值,可行。

以上两个都是变量之间的赋值,所以可行。


本篇是学习了一个博主的内容,指路:blog,这个博主用的是c++,需要的可以看原篇!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐