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;
}
(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 00001000 00000111 ,这与cpu处理时的字节序有关(待详究)