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