数组

 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是一个指向整型变量的指针,这个语句试图将一种类型的指针赋值给另一种类型的指针,所以是非法的。

原文地址:https://www.cnblogs.com/chensup/p/5802184.html