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

  • 相关阅读:
    MIME 类型(HttpContext.Response.ContentType)列表
    Enterprise Library 5.0 系列文章
    实战HTTP处理程序系列(转)
    Ext.Net 的Panel放入iframe
    使用LINQ Expression构建Query Object
    在.NET Workflow 3.5中使用多线程提高工作流性能
    重温DOS下的小作品:回忆过去,展望将来
    CQRS体系结构模式实践案例:Tiny Library:系统架构
    使用Apworks开发基于CQRS架构的应用程序(二):创建领域模型项目
    经典的应用系统结构、CQRS与事件溯源
  • 原文地址:https://www.cnblogs.com/gossiplee/p/4474844.html
Copyright © 2020-2023  润新知