zoukankan      html  css  js  c++  java
  • 【C/C++】深入理解指针和数组的关系

    对数组名进行取地址运算

    int a[] = {1,2,3};
    int (*p)[3] = &a;    //注意左值

    对数组名取地址,得到的指针为指向整个数组的指针。

    形参数组

    形参为数组时勿须带数组长度,因为计算机不会处理,如果需要传数组长度,需要另外加参数。

    一维数组指针

     1 #include <stdio.h>
     2 
     3 //void array_add(int a[], int len)
     4 void array_add(int *p, int len)
     5 {
     6     int i = 0;
     7 
     8     for(i=0; i<len; i++)
     9         p[i]++;
    10 }
    11 int main(void)
    12 {
    13     int a[] = {1,2,3};
    14     int i = 0;
    15     int *p1 = a;
    16     int (*p2)[3] = &a;
    17     int len = sizeof(a)/sizeof(int);
    18 
    19     array_add(a,len);
    20     for(i=0; i<len; i++)
    21         printf("%d	", a[i]);
    22     printf("
    ");
    23 
    24     printf("a[1] = %d
    ", *(p1+1));
    25     printf("a[1] = %d
    ", p1[1]);
    26     printf("a[1] = %d
    ", 1[p1]);
    27 
    28     printf("a[1] = %d
    ", (*p2)[1]);
    29     printf("a[1] = %d
    ", *(*p2 +1));
    30 
    31     return 0;
    32 }
    View Code

    二维数组指针

     1 #include <stdio.h>
     2 
     3 //void array_add(int a[][], int len)
     4 int array_add(int (*p)[3], int row, int lines)
     5 {
     6         int i,j;
     7         int result = 0;
     8         
     9         for(i=0; i<row; i++)
    10             for(j=0; j<lines; j++)
    11                 result += p[i][j];
    12 
    13         return result;
    14 }
    15 int main(void)
    16 {
    17     //一个二维数组可以看做是两个一维数组,而a[0]和 a[1]分别是这两个一维数组的名字。
    18     int a[2][3] = {1,2,3,4,5,6};
    19     int (*p[2])[3]    = {a, a+1};
    20     int (*p1)[3] = a;//数组的名字代表指向数组首元素的首地址(这里二维数组的首元素是一个一维数组)
    21     int (*p2)[2][3] = &a;//对数组名取地址之后,其指针指向整个数组,在这里p2指向整个二维数组,若p2+1,则跳过24个字节,即整个数组。
    22     int *p3 = a[0];
    23     int  (*p4)[3] = &a[0];
    24     int b = a[0][0];
    25     int  *p5  = *a; //在这里a可以看做是指向行的地址,加*之后变成了指向列的地址。(这种描述方式只是便于理解)
    26     int result = 0;
    27 
    28     result = array_add(a, 2, 3);
    29     printf("result = %d
    ", result);
    30 
    31     printf("a[1][1] = %d
    ", *(*(a+1)+1));
    32     printf("a[1][1] = %d
    ", *(*(p1+1)+1));
    33     printf("a[1][1] = %d
    ", p1[1][1]);
    34     printf("a[1][1] = %d
    ", (*p2)[1][1]);
    35     printf("a[1][1] = %d
    ", *(p3+4));
    36     printf("a[1][1] = %d
    ", *(*(p4+1)+1));
    37 
    38     return 0;
    39 }
    View Code
  • 相关阅读:
    《代码大全2》读书笔记(三)
    软工第一次作业 进度记录三 简单的性能分析
    软工第一次作业 进度记录2
    WordPress发布文章前强制要求上传特色图像
    自定义php(NON-CORE WORDPRESS FILE) 引用 wordpress
    php 利用header 函数 下载各种文件
    apache php配置 虚拟目录 和 虚拟主机 多域名配置 原理解析
    JS 动态加载脚本 执行回调
    php 文件上传
    wordpress 插件 汉化
  • 原文地址:https://www.cnblogs.com/lcw/p/3188224.html
Copyright © 2011-2022 走看看