二维数组的深度解剖

 
 
小结:
 int a[3][2];
 a 的值 = a[0]的值= a[0][0]的地址
         a +1 = a[0] +1   
 a 的地址 由系统分配
 &a 指整个二维数组
 
 
#include<stdio.h>
#include<iostream> using namespace std; int main () {     int a[3][2] = {(0,1),(2,3),(4,5)};//注意逗号表达式     cout << a[0]<<endl;  cout << &(a[0][0])<<endl;  cout << a[1]<<endl;  cout << &a[1][0]<<endl;  cout << a[2]<<endl;  cout << &a[2][0]<<endl;  return 0; } 
#include<stdio.h>
#include<iostream>
using namespace std;
int main ()
{
    int a[3][2] = {(0,1),(2,3),(4,5)};//注意逗号表达式
    cout << a[0]<<endl;
	cout << &(a[0][0])<<endl;

	cout << a[1]<<endl;
	cout << &a[1][0]<<endl;

	cout << a[2]<<endl;
	cout << &a[2][0]<<endl;
	return 0;
}


 
 
 
 
 
 1.在int a[3][2]中 数组名a和a[0],a[1],a[2]“都”“不是”指针,在“存储单元中‘不存在’”。
 但在编译器的使用时“存在”但“不占用存储空间”,就是说,“‘编译器’是‘编译器’。‘存储单元’是‘存储单元’,作用的对象不同。对于“编译器来说a和a[0],a[1],a[2]存在。但对于‘存储单元’来说,‘不存在’”
 数组名a和a[0],a[1],a[2]只是供给“编译器使用而产生的标签”。它“不占用”存储单元,只是在“编译器”中,叫a就是叫a[0]。叫a[1]就是叫a[1]。叫a[2]就是叫[2]。
 a和a[0],a[1],a[2]的作用如同“指针”,所以可以把它“看作‘指针常量’”。但“看作”并不代表“是”。它们仅供“编译器”使用,而不占用存储单元。
 就犹如{a[0]}a[0][0],a[0][1],{a[1]}a[1][0],a[1][1],a{2}a[2][0],a[2][1],中{}中的{a[0]}{a[1]}{a[2]}在存储单元中“不存在”,但作为标签使用,其内部分别含有a[0][0],a[1][0],a[2][0]的地址,在编译器访问数组的时候,它们会把它们内的地址赋予在占用存储单元且有自己地址的指针变量,但它们自己在内存中是不存在的。 签+偏移量来访问数组。对于访问数组的指针就把标签内的地址赋值给该指针。” 就是说,标签不属于程序本身,“所以数组名不占用存储空间”是编译器用的。“数组名”是“编译器在编译的时候”使用的标签,是“供给‘编译器’”使用,而不占用存储空间。“但”其内部有a[0]的地址。在访问数组的时候,就把“编译器使用的‘数组名’的地址赋给需要访问数组的占用内存的指针”。作用类同于一个指针。但其实它“不是指针”。 

#include <iostream>  #include<stdio.h> using namespace std;    int main(int argc, char *argv[])  {      int a[3][3]= {1,2,3,4,5,6,7,8,9}; int (*p)[3]; p = a;     cout << p<<endl; cout << a <<endl; cout << endl; cout << p + 1 << endl; cout << &p[1][0]<<endl; cout << (*(p + 1))+0<< endl; cout << a[1]<< endl; cout << &a[1]<< endl; cout << &a[1][0] << endl; cout << endl; cout << *((*(p+1))+0)<<endl;     return 0;  }

#include <iostream> 
#include<stdio.h>
using namespace std; 
 
int main(int argc, char *argv[]) 
{ 
    int a[3][3]= {1,2,3,4,5,6,7,8,9};
	int (*p)[3];
	p = a;
    cout << p<<endl;
	cout << a <<endl;
	cout << endl;

	cout << p + 1 << endl;
	cout << &p[1][0]<<endl;
	cout << (*(p + 1))+0<< endl;
	cout << a[1]<< endl;
	cout << &a[1]<< endl;
	cout << &a[1][0] << endl;
	cout << endl;

	cout << *((*(p+1))+0)<<endl;


    return 0; 
}





#include <iostream> 
#include<stdio.h>
using namespace std; 
 
int main(int argc, char *argv[]) 
{ 
    int a[3][3]= {1,2,3,4,5,6,7,8,9};
	int (*p)[3];
	p = a;
    cout << p<<endl;
	cout << a <<endl;
	cout << endl;

	cout << p + 1 << endl;
	cout << &p[1][0]<<endl;
	cout << (*(p + 1))+0<< endl;
	cout << a[1]<< endl;
	cout << &a[1]<< endl;
	cout << &a[1][0] << endl;
	cout << endl;

	cout << *((*(p+1))+0)<<endl;


    return 0; 
}

</pre><pre name="code" class="cpp">结果:
0018FF24
0018FF24


0018FF30
0018FF30
0018FF30
0018FF30
0018FF30
0018FF30


4
Press any key to continue


     

你可能感兴趣的:(数组,C语言,指针)