C数组和指针

 问题一: 如何理解数组作为函数参数时,数组名就是指针?

 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的效果是一样的但是类型是不一样的!

posted @ 2015-05-03 22:11  ariclee  阅读(270)  评论(0编辑  收藏  举报