zoukankan      html  css  js  c++  java
  • 数组

     1 // array_1.cpp : Defines the entry point for the console application.
     2 // 数组中的地址表示
     3 
     4 #include "stdafx.h"
     5 #include <iostream>
     6 using namespace std;
     7 /**
     8  * 从结果中可以看出,&a、a、&a[0]表示的是同一地址,但是级别是不一样的。
     9    &a+1地址与&a相比,偏移了12个字节,即声明数组的空间大小;
    10    a+1地址与a相比,偏移了4个字节,即数组中一个元素的空间大小;
    11    &a[0]+1地址与&a[0]相比,偏移了4个字节,即数组中一个元素的空间大小;
    12        也就说&a、a、&a[0]虽然都表示同一地址,但是编译器会区分它们,&a指向整个数组的地址,
    13        是数组中最高级别的地址,而a和&a[0]表示&a代表地址的下一级别的地址。
    14  */
    15 
    16 int _tmain(int argc, _TCHAR* argv[])
    17 {
    18     int a[3] = { 1, 2, 3 };
    19     float b[2][5] = {0};
    20     cout <<"a[3] = { 1, 2, 3 }"<<endl<< endl;
    21     cout <<"&a:        "<<&a <<"  // 数组a的起始地址,也就是第一位元素a[0]的地址"<< endl;      // &a 取地址
    22     cout <<"a:         "<<a << "  // 数组a的起始地址,也就是第一位元素a[0]的地址"<<endl;       // a 取地址
    23     cout <<"*(a+0):    "<<*(a+0)<<endl;
    24     cout <<"&a[0]:     " <<&a[0] <<"  // 数组a的起始地址,也就是第一位元素a[0]的地址"<< endl;   // &a[0] 取地址
    25     cout <<"&a[1]:     " <<&a[1] <<"  // a[1] 的地址"<< endl;   // &a[1] 取地址
    26     cout <<"a + 1:     "<< a + 1 <<"  // a[1] 的地址"<< endl;   // a+1地址与a相比,偏移了4个字节,即数组中一个元素的空间大小;
    27     cout <<"&a[0] + 1: "<< &a[0] + 1<<"  // a[1] 的地址" << endl; // &a[0]+1地址与&a[0]相比,偏移了4个字节,即数组中一个元素的空间大小;
    28     cout <<"a + 2:     "<< a + 2 <<"  // a+2地址与a相比,偏移了8个字节,a[2] 的地址"<< endl;   // a+2地址与a相比,偏移了8个字节,即数组中一个元素的空间大小;
    29     cout <<"&a + 0 :   "<<&a + 1<<"  // &a+1 偏移了12个字节,声明数组的空间大小,即数组的最后一个地址再+1;" << endl;  // &a+1 偏移了12个字节,即声明数组的空间大小;    
    30     cout <<"&a + 1 :   "<<&a + 1<<"  // &a+1 偏移了12个字节,声明数组的空间大小,即数组的最后一个地址再+1;" << endl;  // &a+1 偏移了12个字节,即声明数组的空间大小;    
    31     cout <<"&a + 2 :   "<<&a + 1<<"  // &a+2 偏移了12个字节,声明数组的空间大小,即数组的最后一个地址再+1;" << endl;  // &a+1 偏移了12个字节,即声明数组的空间大小;    
    32     cout <<"a[0]:      "<<a[0] <<"   // 指的是下标为[0]的数组的内容"<< endl;    // 指的是下标为[0]的数组的内容
    33     cout <<"*(a+0):    "<<*(a+0)<<"   // 指的是下标为[0]的数组的内容"<<endl;
    34     cout <<"*(a+1):    "<<*(a+1)<<"  // 指的是下标为[1]的数组的内容"<<endl;
    35     cout <<"*(a+2):    "<<*(a+2)<<"  // 指的是下标为[2]的数组的内容"<<endl;
    36     cout <<"a[0] + 1 : "<<a[0] + 1 <<"  // 指的是下标为[1]的数组的内容"<< endl;   // 指的是下标为[1]的数组的内容
    37     cout <<"a[0] + 2 : "<<a[0] + 2 <<"  // 指的是下标为[2]的数组的内容"<< endl;   // 指的是下标为[2]的数组的内容
    38     cout <<sizeof a << endl;
    39     cout <<sizeof b << endl;
    40     system("pause");
    41     return 0;
    42 }
    43 
    44  
    View Code

     例如定义一个数组 :

    1 int calendar[12][31];
    2    int *p;
    3    int i;
    4    p = calendar[4];

              i = calendar[4][7];

    或者: i = *(calendar[4]+7);

    或者: i = *(*(calendar[4])+7);

    但是   p = calendar; //这个语句是非法的,因为calendar是一个二维数组,即“数组的数组”,在此处的上下文中使用calendar名称会将其转换为一个指向数组的指针;而p是一个指向整型变量的指针,这个语句试图将一种类型的指针赋值给另一种类型的指针,所以是非法的。

  • 相关阅读:
    MySQL读写分离
    Error:(1, 1) java: 非法字符: ‘ufeff’
    Java 集合系列(四)—— ListIterator 源码分析
    Java 集合系列(三)—— LinkedList
    Java 集合系列(二)—— ArrayList
    Java 集合系列(一)
    Docker之进入容器(三)
    Docker之常用命令(二)
    Docker之初识(一)
    Redis可视化工具 Redis Desktop Manager
  • 原文地址:https://www.cnblogs.com/chensup/p/5802184.html
Copyright © 2011-2022 走看看