问题一: 如何理解数组作为函数参数时,数组名就是指针?
1 #include<iostream>
2 #include<stdio.h>
3 using namespace std;
4 void IntFun(int arr[])
5 {
6 // 此处是编译器自动省略了 arr(形参) = A1(实参)
7 printf("%x \n", arr); // 故此处打印的是实参传过来的地址,也就是第一个元素的地址
8 printf("%x \n", &arr); // 而此处打印的是形参的地址也可以解释
9 printf("%x \n", &arr[0]);
10 }
11 void CharFun(char arr[])
12 {
13 printf("%x \n", arr);
14 printf("%x \n", &arr);
15 printf("%x \n", &arr[0]);
16 printf("%s \n", arr);
17 printf("%s \n", &arr);
18 printf("%s \n", &arr[0]);
19 }
20 int main()
21 {
22
23 int A1[] = {1, 2, 3, 4, 5};
24 char A2[] = "Hello World!";
25
26 //C语言方法打印的是第一个元素的地址
27 printf("C_MAIN_INT-------------------------------\n");
28 printf("%x \n", A1); // 打印第一个元素地址
29 printf("%x \n", &A1); // 打印第一个元素地址
30 printf("%x \n", &A1[0]); // 打印第一个元素地址
31
32 printf("\nC_MAIN_CHAR-------------------------------\n");
33 printf("%x \n", A2); // A2即地址,打印第一个元素地址
34 printf("%x \n", &A2); // A2即地址,打印第一个元素地址
35 printf("%x \n", &A2[0]); // A2即地址,打印第一个元素地址
36 printf("%s \n", A2); // A2即地址,即从第一个元素开始打印以字符串的形式
37 printf("%s \n", &A2); // A2即地址,即从第一个元素开始打印以字符串的形式
38 printf("%s \n", &A2[0]); // A2即地址,即从第一个元素开始打印以字符串的形式
39 // printf("%s \n", &A2[7]); // 从数组的第8个元素开始打印
40
41
42 printf("\nC_FUN_INT-------------------------------\n");
43 IntFun(A1);
44
45 printf("\nC_FUN_CHAR-------------------------------\n");
46 CharFun(A2);
53
54 return 0;
55 }
问题一结论: 当Arr为数组时,Arr,&Arr,&Arr[0]效果是一样的,都是数组第一个元素的地址.但是也有例外,在数组(此处的Arr为形参)作为函数参数的时候,&Arr是形参的地址并不是实参的地址,形参的地址即为编译器自动为局部变量Arr分配的地址,实参的地址即为主函数实参数组的第一个元素的地址.而这种情况下的另外两个表达式也就是Arr和&Arr[0]还是一样的含义为实参第一个元素的地址
问题二:对数组名取地址是个什么鬼?为什么在主函数中&Arr和Arr的效果是一样的?
1 #include<iostream>
2 #include<stdio.h>
3 using namespace std;
4
5 int main()
6 {
7
8 int Arr[100] = {1,2,3,4,5,6,7};
9
10 int *p1 = Arr; // p1是个指向int型变量的指针变量!
11
12 typedef int (* P)[100];// P是用户自定义的类型,是个指针类型,该指针指向int型的大小为100的数组
13
14 P p2 = &Arr; // p2是指向int数组类型的指针变量!
15
16 printf("p1: 0x%X \n", p1);
17 printf("p2: 0x%X \n", p2);
18
19 printf("p1[1]: %d \n", p1[1]);
20 printf("p2[1]: %d \n", p2[1]);
21 printf("(*p2)[1]: %d \n", (*p2)[1]);
22
23 return 0;
24 }
问题二结论: p1和p2的效果是一样的但是类型是不一样的!