数组之间的赋值(数组之间不能直接赋值arr1≠arr2) -- C语言
数值之间不能直接赋值,即arr1≠arr2。不能直接赋值,那有没有别的办法赋值呢?数组之间赋值的案例怎么分析?
数组之间的直接赋值,就是直接用 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++,需要的可以看原篇!
更多推荐
所有评论(0)