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

  • 相关阅读:
    雪花算法解决的问题
    ServiceStack6000次限制破解
    电商 详情页面 nginx 配置 优先请求静态页,若没有请求动态页,同时生成静态页
    docker 使用汇总
    .net 5 新特性 -- EFCoreDBFirst 介绍 和 .NET5 AOP 5个Filter
    模板方法设计模式:定义抽象类-模板:定义业务流程,执行步骤--》各业务类继承抽象类,实现各自不同 具体的执行步骤
    通过代理模式(包一层),实现对业务增加功能如日志,异常处理,缓存结果,到达不破坏原有的业务代码,扩展了功能
    设计模式
    mongodb 基本操作(增删改查),事务,数据失效机制
    log4net.Config
  • 原文地址:https://www.cnblogs.com/gossiplee/p/4474844.html
Copyright © 2020-2023  润新知