首页 > 其他分享 >函数传参类型为数组时,int*和char*的区别

函数传参类型为数组时,int*和char*的区别

时间:2023-05-20 18:31:31浏览次数:29  
标签:传参 arr int char 数组 printf test

1.现象

(1)假设有一个int型数组,我们先用int*给函数传参

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void test(int* arr) {
	arr[1] = 8;
}
int main() {
	int arr[] = { 7,3,4,6,8,9,1,5,2,10 };
  test(arr);
	printf("%d\n", arr[0]);
	printf("%d", arr[1]);
	return 0;
}

函数运行正常,打印的第一个数为7,第二个数为8,成功把数组的3替换为8。

(2)还是这个int型数组,我们用char*给函数传参

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void test(char* arr) {
	arr[1] = 8;
}
int main() {
	int arr[] = { 7,3,4,6,8,9,1,5,2,10 };
  test(arr);
	printf("%d\n", arr[0]);
	printf("%d", arr[1]);
	return 0;
}

函数运行错误,打印的第一个数为2055,第二个数为3

2.原理

(1)当我们把数组传递给函数时,实际上传递的是数组首元素的地址,如果用int*传递,则每个元素的地址相隔4个字节

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void test_point(int* arr) {
	printf("%p\n", &arr[0]);
	printf("%p\n", &arr[1]);
	printf("%p\n", &arr[2]);
}
int main() {
	int arr[] = { 7,3,4,6,8,9,1,5,2,10 };
	test_point(arr);
	return 0;
}

函数传参类型为数组时,int*和char*的区别_int*

(2)如果用char*传递,则每个元素的地址相隔1个字节

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void test_point(char* arr) {
	printf("%p\n", &arr[0]);
	printf("%p\n", &arr[1]);
	printf("%p\n", &arr[2]);
}
int main() {
	int arr[] = { 7,3,4,6,8,9,1,5,2,10 };
	test_point(arr);
	return 0;
}

函数传参类型为数组时,int*和char*的区别_int*_02


为什么是2055?

int在内存中以补码的形式存储(对于正数,原码=反码=补码

函数传参类型为数组时,int*和char*的区别_int*_03

2055用二进制表示是00000111  00001000 00000000 00000000,而不是00000000 00000000 00001000 00000111 ,这与cpu处理时的字节序有关(待详究)

标签:传参,arr,int,char,数组,printf,test
From: https://blog.51cto.com/u_16102535/6317685

相关文章

  • Jmeter函数助手9-char
    char函数用于将数字转换为unicode字符。Unicode字符数(十进制或0xhex):必填,填入数字 1、如果把各种文字编码形容为各地的方言,那么unicode统一码就是世界各国合作开发的一种语言。下图是unicode十进制对照表2、那么我们根据表格传入十进制${__char(35,81,90)},结果会输出对照......
  • IntelliJ IDEA一站式配置【全】(提高开发效率)
    IDEA常用设置(提高开发效率)本人也是IDEA编译器的忠实用户了,但是有时出于各种原因,比如更换设备等等,IDEA总是需要重新安装配置。这就让我比较苦恼,因为总是记不全自己之前都修改了哪些地方(原谅脑子不好使hh),所以就以此篇文章记录一下目前我的IDEA的设置情况。可能依旧不太全(后续会持......
  • Oracle migrate the users into another DB instance
    -----------------------------------------------###############OnSource###################---------------------------------------------createorreplaceprocedurepr_user_ddlascursorget_usernameisselectusernamefromdba_userswhereusernamelik......
  • IntelliJ IDEA Maven/Gradle仓库下载速度慢
    阿里Maven仓库:https://developer.aliyun.com/mvn/guide华为Maven仓库:https://www.huaweicloud.com/special/maven-jingxiang.html腾讯镜像仓库:https://mirrors.tencent.com/网易镜像仓库:https://mirrors.163.com/Maven仓库:https://mvnrepository.com/ 打开C:\Users\用户......
  • May 2022-Neighborhood Mixup Experience Replay: Local Convex Interpolation for Im
    摘要:经验回放在提高深度强化学习智能体的样本效率方面起着至关重要的作用。经验回放的最新进展建议使用Mixup-2018,通过合成样本生成进一步提高样本效率。在这种技术的基础上,提出了邻域混合经验回放(NMER),一种基于几何的回放缓冲区,用状态-动作空间中最近邻的转换进行插值。NMER仅......
  • Echarts初学(一)
    一、安装在需要创建图表的组件中全局引入 图表组件中入门实例图表<scriptsetuplang="ts">//全局引入import*asechartsfrom"echarts";import{onMounted}from"vue";importTestChartsfrom"@/components/TestCharts.vue";onMounted(()=&g......
  • 可视化:雷达图(Radar Chart)
    什么是雷达图?雷达图(RadarChart)也称为蜘蛛图、网络图或极坐标图,是一种用于可视化多变量数据的图表。该图表由一系列从中心点向外辐射的辐条组成,每个辐条代表一个不同的变量。数据使用线或区域绘制在每个辐条上,最终结果看起来像蜘蛛网。雷达图不同类型雷达图(RadarChart)有三种变体:......
  • Intellij IDEA 如何删掉插件
    在IntellijIDEA的配置中,找到插件选项。在插件选项中,选择需要删除的插件,然后在右侧的对话框中选择uninstall就可以了。  卸载以后,可能不会要求重启,为了安全起见,还是重启下你的IDE吧。 https://www.ossez.com/t/intellij-idea/14436......
  • 【python】【报错:pip中第三库下载成功,但是pycharm却没有显示】一步解决
     解决方案: 直接在这个目录下安装第三方库 ......
  • Echarts X轴 强制显示所有标签 && 每行固定字数并换行显示
     效果图如下: 直接上代码:axisLabel:{//轴文字interval:0,//强制显示完整//每行显示4个文字换行formatter:function(value){varret="";//拼接加\n返回的类目项varmaxLen......