理解c语言数组类型

抛砖:数组类型,压死初学者的三座大山
1、数组类型;数组名
2、数组指针;与数组名同等级还是上一级需要&才能赋值
3、数组类型和数组指针的关系;

先以一维数组为例;int a[10]; int *a1; int (*a2)[10];
a;a数组的首地址,即为指针其指向的类型就是int,则a可等效于a1.其区别在于a是常量不能修改a = a+1;这一修改,而a1是变量,两者都可以进行加减法。
a1;是指向一个int类型的指针。
a2;其实一个指针,指向的是一个int 【10】的数组类型。因此可以a2 = &a;这样数据类型才对齐。

在以二维为例int b[][10];int (b1)[10];同样b是常量不能改变,b1是变量。
b;b是数组的首地址,即为指针其指向的是int 【10】的数组,因此加减法的基本单位为40个字节。
因此b+1就是第二行的首地址,
(b+1)才是第二行数组的首地址。再取*才是数组的值了。
而b1其指向的类型与b是一致的,因此两则可以b1 = b;

#include <stdio.h>

int main()
{
	int b = 10;
	int a[10]={1,5,3,4,10,6,7,8,9,0};
	int a1[][10]={
					{1,2,3,4,5,6,7,8,9,0},
					{10,2,3,4,5,6,7,8,9,0}
				};
	printf("%d\n",b);//b变量做右值表示取值 
	b = 12; //b变量做左值表示操作b空间。 
	printf("%d\n",*(a+1)); //a是一个地址,其加法的基本单位是int(因为下一层次是int类型)加4再取值就是第二个元素 
	printf("%d\n",(*a+1));//先取值再加1.
	
	//同理理解二维数组。
	//a1+1;则表示跳转到第二行,表示第二行的首地址,是第二行的地址而不是第二行数组的首地址
	//*(a1+1);这个才表示第二行数组的首地址。打印的值是一样的,但是其数据类型不是一样的。 
	printf("%d\n",*(*(a1+1)+2));
	以上是数组类型的测试/
	///下面是关于数组指针类型的测试///
	int *p = NULL;
	int (*p1)[10] = NULL;//优先级问题,* []是同一等级再从右往左,因此要打括号。 
	p = a;
	printf("%d\n",*(p+1));
	p1 = &a;
	printf("%d\n",*((*p1+1)+1));
	p1 = a1;
	printf("%d\n",*((*p1+1)+1));
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zw1996/article/details/84705948