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
  • 相关阅读:
    个人记录--当前年月,求当月天数和上月
    java修改图片大小
    多层iframe的页面取子标签
    oracle的游标
    json中获取key值
    iOS开发常用代码块(2)
    大话数据结构(六)——链式存储
    项目中比较有用得到js经验
    微信公众号开发——php sdk php中curl用法
    微信页面设计weui源代码(4)——Pciker微信页面中实现下拉菜单
  • 原文地址:https://www.cnblogs.com/lcw/p/3188224.html
Copyright © 2011-2022 走看看