zoukankan      html  css  js  c++  java
  • c数组和指针的理解

     1 #include<stdio.h>
     2 
     3 int main(void)
     4 {
     5     int a[]={1,2,3,4,5};
     6     int *p = (int*)(&a + 1);
     7     printf("%d,%d
    ",*a+1,*(p-1));
     8 
     9     // int (*ptr1)[5] = &a;    √
    10     // int (*ptr2)[5] = a;     ×
    11     // int (*ptr1)[3] = &a;    ×
    12     // int (*ptr2)[3] = a;     ×
    13 }
    14 
    15 //2,5

     

    数组名只可以作为右值!

    当我们定义一个数组时候,编译器根据指定的元素个数和类型确定分配内存大小。并把这一块地址的名称赋为数组名称。

    a[0]、a[1]......为数组元素,但并非元素名称!

    指针,32系统总是为4字节(0x11111111)只能存放一个地址单元的值,所以总是存放的首地址。

    但是访问时候需要根据类型大小来移动指针。

        数组名:值等同于数组“首元素”的“首地址”(数组首元素的指针)

         P + 1

         char*移动一个字节,int*移动4个字节!数组指针移动一个数组元素类型长度!二级指针移动一个指针长度(4)!

         &a:表示数组指针(取数组变量a的指针)

    对数组的访问,总是转换为对指针的访问!

    二维数组

    1 int b[2][2] = {{1,2},{3,4}};
    2 // int *p2 = b;         ×
    3 // int (*p5)[2] = b;    √
    4 // int **p      = b;    ×

    二维数组名称,指向首元素b[0]的指针,为数组指针【一级指针】!

    1 // int *p3 = b[0];             √
    2 // int (*p4)[2][2] = &b;    √

    二维数组所有元素的访问(一级指针):

     1 #include<stdio.h>
     2 int main()
     3 {
     4     int iArray[2][3] =        {{1,2,3},{4,5,6}};
     5     int *pArray = NULL;
     6 
     7     pArray = (int*)iArray;
     8   
     9 
    10     printf("array[0][0] = %d
    ", *pArray);
    11     printf("array[1][2] = %d
    ", *(pArray + 5));
    12     printf("array[1][2] = %d
    ", *(pArray + 1 * 3 + 2));      /*数组本身在地址空间中就是连续排列的*/
    13     printf("array[1][2] = %d
    ", *((int *)(*((int (*)[3])pArray + 1)) + 2));
    14     return 0;
    15 }

    二维数组所有元素的访问(数组指针):

    1 #include<stdio.h>
    2 
    3 int main()
    4 {
    5     int iArray[2][3] = {{1,2,3},{4,5,6}};
    6     int (*pArray)[3] = NULL;
    7    
    8     pArray = iArray;
    9 
    10     printf("array[0][0] = %d
    ", **pArray);
    11     printf("array[1][2] = %d
    ", *(*(pArray+1)+2));
    12     return 0;
    13 }
     1 int main()
     2 {
     3         int iArray[2][3] =        {{1,2,3},{4,5,6}};
     4 
     5         int (*pArray)[3] = NULL;
     6 
     7         pArray = iArray;
     8 
     9         printf("array[0][0] = %d
    ", pArray[0][0]);
    10         printf("array[1][2] = %d
    ", pArray[1][2]);
    11         return 0;
    12 }

    二级指针

    为指向指针的指针,指向的值必须是指针。

     1 int main()
     2 {
     3         int iArray[2][3] =        {{1,2,3},{4,5,6}};
     4         int *ipArray[2] = {iArray[0], iArray[1]};
     5         int **pArray = NULL;
     6 
     7          pArray = ipArray;
     8      
     9         printf("array[0][0] = %d
    ", pArray[0][0]);
    10         printf("array[1][2] = %d
    ", pArray[1][2]);
    11      
    12         return 0;
    13 }
  • 相关阅读:
    运算符(C# 参考)
    virtualbox修改主机名
    偏前端HTML5 sessionStorage会话存储
    偏前端纯css,手写轮播(焦点切换 和 自动轮播 只可选择一种,两者不可共存)
    偏前端 div+mui+vue.js 制作问卷调查单页 ——题目答案由后台随机给出10道
    偏前端 jqueryiframe内触发父窗口自定义事件
    TWAIN扫描打印图像编辑处理控件ImagXpress功能大全
    实时温度计湿度计高效仪器控件Iocomp使用教程
    Essential Diagram for Windows Forms绘图控件图解及下载地址
    Code39 Fontware条形码控件
  • 原文地址:https://www.cnblogs.com/licongyu/p/5026542.html
Copyright © 2011-2022 走看看