当前位置 : 主页 > 编程语言 > c语言 >

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

来源:互联网 收集:自由互联 发布时间:2023-09-03
1.现象 (1)假设有一个int型数组,我们先用int*给函数传参 #define _CRT_SECURE_NO_WARNINGS 1#includestdio.hvoid 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]

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处理时的字节序有关(待详究)

上一篇:将邻接矩阵转化为邻接表
下一篇:没有了
网友评论