博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C数组和指针
阅读量:4680 次
发布时间:2019-06-09

本文共 2407 字,大约阅读时间需要 8 分钟。

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

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

转载于:https://www.cnblogs.com/gossiplee/p/4474844.html

你可能感兴趣的文章