当数组作为函数参数,int*与char*有何本质区别?

2026-04-12 01:171阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计465个文字,预计阅读时间需要2分钟。

当数组作为函数参数,int*与char*有何本质区别?

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

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个字节

当数组作为函数参数,int*与char*有何本质区别?

#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; }

(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; }


为什么是2055?

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

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

标签:

本文共计465个文字,预计阅读时间需要2分钟。

当数组作为函数参数,int*与char*有何本质区别?

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

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个字节

当数组作为函数参数,int*与char*有何本质区别?

#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; }

(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; }


为什么是2055?

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

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

标签: