zoukankan      html  css  js  c++  java
  • <深入理解C指针>学习笔记和总结 第四章 指针和数组

    数组是一个什么玩意:
    数组和指针我的理解,有同样之处也有不同之处。因有同样之处,因此一些资料上说,数组和指针本质是同样的。因有不同之处,因此也有一些资料上说,数组和指针是不一样的。
    同样之处:
    数组名字和指针名字都代表了一个地址。
    如:int num[10];num是数组名。函数开辟了一个存储十个整数类型的空间,而num是他们的首地址。
    int *p;
    p=(int *)malloc(10*sizeof(int));类似的,p也指向了首地址。
    不同之处是,num[10]中的空间位置是在栈中,而 ×p指向的空间是在堆中。
    p能够指向别的地址(即p能够进行指针运算。是一个变量)可是num不能够运算,是一个常量。
    一维数组与指针数组:
    int num[5]={1,2,3,4,5};
    引用的时候:printf("%d",num[i]);
    int *num2[5]={&n1,&n2,&n3,&n4,&n5};
    引用的时候:printf("%d",*num[i]);
    二维数组:
    int num[i][j];


    能够用malloc创建数组:
    int *pv=(int *)malloc (5*sizeof(int));
    for(i=0;i<5;i++)
    p[i]=i+1;//*(p+i)=i+1;
    指针的一维数组:
    int *arr[5];
    int i;
    for(i=0;i<5;i++)
    {
        arr[i]=(int *)malloc(sizeof(int));
        *arr[i]=i;
    }
    或者:
    *(arr+i)=(int *)malloc(sizeof(int));
    **(arr+i)=i;
    另外一种分析: (arr+i)表示数组第i个元素的地址。我们须要改动这个地址中的内容,因此用了×(arr+i)而 arr+i的内容是一个指针,指向一个内存。因此再此解引。返回的是所分配内存的位置。
    二维数组的传递:
    以2.c为样例。尽管是二维数组,可是 在函数中,是以一维数组来使用的。由于声明中就是一维数组。所以在子函数中无法以arr[i][j]的方式来使用数组里的内容。仅仅能用
    arr+偏移量 然后解引的方式: *(arr+(i*cols)+j)
    也能够动态分配二维数组:
    int rows2;
    int columns=5;
    int **matrix=(int **)malloc(rows*sizeof(int *));//类型是二维数组。里面的每个元素是一个整形指针。
    for(i=0;i<rows;i++)
    {
        matrix[i]=(int *)malloc(colums*sizeof(int));//每个元素都指向一个整形一维数组。
    }

    该方式类似于參考 字符串指针的表示方式。

    代码演示样例:

    1//指针数组:
    #include <stdio.h>
    int main(void)
    {
        int* num1[3];
        int num2[3]={1,2,3};
        int i;
        for(i=0;i<3;i++)
    num1[i]=&num2[i];
        for(i=0;i<3;i++)
    printf("%4d",*num1[i]);
        putchar(' ');
        return 0;
    }

    2/二维数组的表示:
    #include <stdio.h>
    void arr_initial(int *arr,int rows,int cols)
    {
        int i,j;
        int num=1;
    for(i=0;i<rows;i++)
      for(j=0;j<cols;j++)
      {
         *( arr+(i*cols)+j)=num++;
      }
    }
    void arr_print(int *arr,int rows,int cols)
    {
        int i,j;
        int num=1;
    for(i=0;i<rows;i++)
    {for(j=0;j<cols;j++)
      {
         printf("%4d",*( arr+(i*cols)+j));
      }
      putchar(' ');
    }
    }


    int main(void)
    {
        int num1[5][6];
        int num2[7][8];
        arr_initial(&num1[0][0],5,6);
        arr_print(&num1[0][0],5,6);
        arr_initial(&num2[0][0],7,8);
        arr_print(&num2[0][0],7,8);
        return 0;
    }


  • 相关阅读:
    [转载]重构代码的7个阶段
    查看JDK源码
    敏捷结果30天之第七天:设定边界值和缓冲
    敏捷结果30天之第十一天:高效能、慢生活
    他们到底需要神马???——戏说“用户需求”
    敏捷结果30天之第一天:总体认识敏捷结果方法
    敏捷结果30天之第五天:使用热图标识出重要事情
    重构代码学习笔记一:重构的原则
    开发可统计单词个数的Android驱动程序(2)
    使用Android NDK和Java测试Linux驱动
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3854873.html
Copyright © 2011-2022 走看看