抛砖:数组类型,压死初学者的三座大山
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;
}
————————————————
版权声明:本文为CSDN博主「zw1996」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zw1996/article/details/84705948
版权声明:本文为CSDN博主「zw1996」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zw1996/article/details/84705948