C语言数组升华-数组类型-数组指针类型

一、数组的概念

        从元素类型角度:数组是相同诶性的变量的有序集合。

        从内存角度讲:连续的一大片的内存空间。

       注:

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

                      -》下面代码就可说明:

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
	int a[5];
	printf("得到整个数组的地址a: %d  %d\n", &a,&a+1);
	printf("数组的首元素的地址a: %d  %d\n",a,a+1);
	system("pause");
}

  输出:

得到整个数组的地址a: 9828088  9828108
数组的首元素的地址a: 9828088  9828092
请按任意键继续. . .

   注:

       上面的&a代表了数组的地址,我们可以通过看&a+1的步长来证明,&a+1比&a的地址大了20个字节,元

素个数 = 20/sizeof(int) = 5 ,刚刚好是整个数组的全部长度。而我们的a和a+1的步长只有4个字节,刚好是一个

元组的字节。

           2)数组名代表数组首元素的地址,他是一个常量。

                      -》变量的本质是内存空间的别名,一定义数组,就分配内存,内存分配后,内存就会被固定下

                            来,因此数组名起名之后就别能被更改。

          3)数组首元素的地址和数组的地址相等。

二、数组类型

        数组类型由元素类型和数组大小共同决定。

        定义语法:typedef  数据类型(自定义类型名称)[数组大小];        

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
	typedef int(Array5)[5];
	Array5 a;		// int a[5]   a是一个数组,也是一个数组类型的变量
	for (int i = 0; i < 5; i++)
	{
		a[i] = i;
	}
	printf("%d\n", sizeof(a));
	for (int i = 0; i < 5; i++)
	{
		printf("%d  ", a[i]);
	}
	system("pause");
}

输出:

20
0  1  2  3  4  请按任意键继续. . .
三、数组指针类型

       数组指针的本质还是一个指针,这个指针指向了一个数组,我们在开始的时候说过,数组名是数组首元素的起始地址,但并不是数组的起始地址,我们通过对数组名使用 '&' 可以得到整个数组的起始地址。

       我们定义一个数组指针有三种方式:

        1、通过定义数组类型去定义数组指针。             
#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(void)
{
	typedef char(ArrayChar5)[5];
	ArrayChar5 *myarray = NULL;
	//myarray 的本质也只是一个字符二维指针 
	printf("sizeof(ArrayChar5):%d  sizeof(myarray):%d  sizeof(*myarray):%d \n",sizeof(ArrayChar5), sizeof(myarray),sizeof(*myarray));
	char a[5] = "dsdq";
	myarray = &a;
	for (int i = 0; i < 4; i++)
	{
		//数组指针的本质就是一个二维指针
		printf("*(*myarray+%d): %c \n",i,*(*myarray+i));
	}
	printf("*myarray:%s\n",*myarray);
	system("pause");
	return 0;
}

输出:

sizeof(ArrayChar5):5  sizeof(myarray):4  sizeof(*myarray):5
*(*myarray+0): d
*(*myarray+1): s
*(*myarray+2): d
*(*myarray+3): q
*myarray:dsdq
请按任意键继续. . .

        2、通过定义数组指针类型去定义变量。   
int main(void)
{
	typedef char(*ArrayChar5)[5];
	ArrayChar5 myarray = NULL;
	//myarray 的本质也只是一个字符二维指针 
	printf("sizeof(ArrayChar5):%d  sizeof(myarray):%d  sizeof(*myarray):%d \n", sizeof(ArrayChar5), sizeof(myarray), sizeof(*myarray));
	char a[5] = {'0'};
	myarray = &a;
	for (int i = 0; i < 4; i++)
	{
		*((*myarray) + i) = i+1+'0';
	}
	for (int i = 0; i < 4; i++)
	{
		//数组指针的本质就是一个二维指针
		printf("*(*myarray+%d):%c\n", i, *((*myarray) + i));
	}
	printf("*myarray:%s\n", *myarray);
	system("pause");
	return 0;
}

输出:

sizeof(ArrayChar5):4  sizeof(myarray):4  sizeof(*myarray):5
*(*myarray+0):1
*(*myarray+1):2
*(*myarray+2):3
*(*myarray+3):4
*myarray:1234
        3、直接去定义一个数组指针变量。   
int main(void)
{
	char a[5];
	char(*ArrayChar5)[5] = &a;
	//ArrayChar5的本质也只是一个字符二维指针 
	printf("sizeof(ArrayChar5):%d sizeof(*ArrayChar5):%d \n", sizeof(ArrayChar5),sizeof(*ArrayChar5));
	for (int i = 0; i < 4; i++)
	{
		*((*ArrayChar5) + i) = i + 1 + '0';
	}
	*((*ArrayChar5) + 4) = '\0';    //字符串结尾是字符‘\0’
	for (int i = 0; i < 4; i++)
	{
		//数组指针的本质就是一个二维指针
		printf("*(*myarray+%d):%c\n", i, *((*ArrayChar5) + i));
	}
	printf("*myarray:%s\n", *ArrayChar5);
	system("pause");
	return 0;
}

输出:

sizeof(ArrayChar5):4 sizeof(*ArrayChar5):5
*(*myarray+0):1
*(*myarray+1):2
*(*myarray+2):3
*(*myarray+3):4
*myarray:1234
请按任意键继续. . .

四、总结

        数组类型的本质是一个数据类型,由数组类型定义的变量,是一个数组。

        数组指针的本质是一个指向数组的二级指针。





猜你喜欢

转载自blog.csdn.net/m0_37717595/article/details/80621321