欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数组类型和多维数组本质

程序员文章站 2024-03-04 15:49:47
...

数组概念

Ø  1)元素类型角度:数组是相同类型的变量的有序集合测试指针变量占有内存空间大小

Ø  2)内存角度:联系的一大片内存空间

数组类型和多维数组本质


数组初始化

Ø  //数组元素的个数可以显示或隐式指定

Ø  //分析数组初始化{0}与memset比较

 

int main()

{

         inti = 0;

         inta[10] = {1,2}; //其他初始化为0

         intb[] = {1, 2};

         intc[20] = {0};

 

         for(i=0; i<10; i++)

         {

                   printf("%d", a[i]);

         }

         memset(a,0, sizeof(a));    //sizeof(a)=800   //对一维数组  C规定: a是数组首元素的地址 c+1 步长 4个字节
                                                                //&a 是整个数组的地址 &c+1 步长 200*4 

         getchar();

         return0; 

}


数组名的技术盲点

Ø 1)数组首元素的地址和数组地址是两个不同的概念

Ø 2)数组名代表数组首元素的地址,它是个常量。        指针可以++操作,而数组名也可以转化为指向第一个元素的指针,但是为什么数组名不能++操作呢? 
                                 因为定义了一个数组,那么这个数组的地址就是固定的了。如char p[] = "ssd"; 那么p的地址是固定的。相当于char                                   *const类型。改变p的指向当然错了。


数组类型、数组指针类型、数组指针类型变量


数组类型

/怎么样表达int a[10]这种数据类型那?int[] 
//类型本质:固定大小内存块的别名
//定义数组类型
void main12()
{

	typedef int (MyArrayType)[5]; //定义了一个数据类型  数组数据类型
	int i = 0;
	MyArrayType  myArray;  //int myArray[5];

	for (i=0; i<5; i++)
	{
		myArray[i] = i+1;
	}

	for (i=0; i<5; i++)
	{
		printf("%d ", myArray[i]);
	}

	printf("myArray代表数组首元素的地址 myArray:%d myArray+1:%d \n", myArray, myArray+1);
	printf("&myArray代表整个数组的地址 &myArray:%d &myArray+1:%d \n", &myArray, &myArray+1);

	printf("hello...\n");
	system("pause");
	return ;
}

数组指针类型

Ø  数组指针用于指向一个数组

int a[10]

数组名是数组首元素的起始地址,但并不是数组的起始地址

通过将取地址符&作用于数组名可以得到整个数组的起始地址

//定义数组指针 有两种

1)通过数组类型定义数组指针:

typedef int  (ArrayType)[5];  int *a

ArrayType* pointer;

2) 声明一个数组指针类型 typedef int (*MyPointer)[5];

MyPointer myPoint;

3)直接定义:int (*pointer)[n]; 

       pointer  为数组指针变量名

       type       为指向的数组的类型

       n            为指向的数组的大小

注意这个地方是type类型(比如 int (*pointer)[10])


//定义数组指针变量的方法1  
//用数组类型 * 
void main13()
{
	char *Myarray[] = {"1111", "33333", "aaaa"}; //指针 数组

	//数组指针  用一个指针 来指向一个数组

	typedef int (MyArrayType)[5]; //定义了一个数据类型  数组数据类型
	int i = 0;
	MyArrayType  myArray;  //int myArray[5]; //用类型定义变量 

	MyArrayType *pArray; //定义一个指针变量 这个指针变量 指向一个数组

	{
		int  a;
		int *p = NULL;
		p = &a;

	}
	{
		int myArray2[5]; //相当于一级指针

		pArray = &myArray2; //相当于2级指针
		for (i=0; i<5; i++)
		{
			(*pArray)[i] = i+1;
		}
	
		for (i=0; i<5; i++)
		{
			printf("%d ", (*pArray)[i]);
		}
	}
	printf("hello...\n");
	system("pause");
	return ;

}

//定义数组指针变量的第二种方法

void main14()
{

	//定义声明一个数组指针类型
	typedef int (*PArrayType)[5];
	PArrayType pArray;  //告诉编译器 给我分配一个指针变量

	int c[5];
	int i  = 0;
	pArray = &c;

	for (i=0; i<5; i++)
	{
		(*pArray)[i] = i + 1;
	}

	for (i=0; i<5; i++)
	{
		printf("%d ", (*pArray)[i]);
	}

	printf("hello...\n");
	system("pause");
	return ;
	
}

//定义数组指针变量的第三种方法
//前2种方法 通过类型定义变量 比较麻烦

void main116()
{
	//int [][5]
	int (*pMyArray)[5]; //直接定义一个指向数组的 数组指针变量
	int c[5];
	int i  = 0;
	pMyArray = &c;

	for (i=0; i<5; i++)
	{
		(*pMyArray)[i] = i + 1;
	}

	for (i=0; i<5; i++)
	{
		printf("%d ", (*pMyArray)[i]);
	}

	printf("hello...\n");
	system("pause");
	return ;

}


多维数组本质技术推演

void main222()
{
	int a[3][5];
	int b[10]; //b代表数组首元素的地址 &b代表这个数组的地址 &b+1相当于 指针后移4*10个单位
	
	//a代表什么什么那?a是一个数组指针 指向低维数组的指针
	//a +1;
	printf("a:%d, a+1:%d \n", a, a+1); //4*5    
 //理解:相差二十个字节,对于a来说,相当于&a[0],所以&a[0]+1跳了整个行数组的大小   //a的本质是一个数组指针,每次往后跳一维的维数


        printf("&a %d , &a+1:%d ", &a, &a+1); //3*5*4   
//理解:相差80个字节,相当于跳了整个二维数组,所以&a代表整个数组大小
         printf(“%d”,sizeof(a));  //60      
 
      
}


总结:

/*

         charcbuf[30]; // cbuf(1级指针)代表数组首元素的地址。。。&cbuf(二级指针)代表整个数组的地址

         chararray[10][30]; //array是二级指针

         (array+i)//相当于 整个第i行的数组地址 //二级指针&cbuf

 

         (*(array+i))//一维数组的首地址 cbuf

 

         (*(array+i))+j) //相当于第i行第j列的地址了把。。。。&array[i][j]

 

         *((*(array+i))+j) //相当于第i行第j列的地址了把。。。。<====>array[i][j]

         */

*/

数组类型和多维数组本质


多维数组做函数参数退化原因大剖析


nt  func(int   a[4][5],   int   num)相当于int func (int (*a)[5] ,int num)

c语言时期遗留的规范,数组类型不能当做形参和返回值,这样写编译器会自动退化该数组


数组参数                                               等效的指针参数

        

一维数组 char a[30]                                   指针 char*

指针数组 char *a[30]                                指针的指针 char**a

二维数组 char a[10][30]                           数组的指针 char(*a)[30]



相关标签: c