龙空技术网

C语言的2个小例子,搞明白数组不再迷茫

电子秘探 707

前言:

此时看官们对“c语言判断两数组相等”大概比较关怀,我们都需要分析一些“c语言判断两数组相等”的相关资讯。那么小编在网摘上收集了一些关于“c语言判断两数组相等””的相关内容,希望你们能喜欢,同学们一起来了解一下吧!

问题一:结果是a[2] = 7是哪几条语句

int a[3]={2,5,7};printf("a[2] = %d\n", a[2]);printf("a[2] = %d\n", *(a+2));printf("a[2] = %d\n", *(&a+2));printf("a[2] = %d\n", *(&a[1]+1));printf("a[2] = %d\n", *(&a[0]+2));

问题二:

哪一句编译器会爆警告:类型不匹配

warning: assignment from incompatible pointer type

int *p;int a[3]={2,5,7};P = a;    p = &a;	p = &a[0];  

a , a[0], &a, &a[0],理解这些符号的时候要和左值右值结合起来,也就是搞清楚每个符号分别做左值和右值时的不同含义。

1、a,表示数组名

a做左值时表示整个数组的所有空间(10×4=40字节)【又因为C语言规定数组操作时要独立单个操作,不能整体操作数组,N 所以a不能做左值】;

a做右值表示数组首元素的首地址首元素首地址就是数组的第0个元素的起始地址,也就是a[0]的起始地址)

2、a[0],表示数组的首元素,也就是数组的第0个元素。

a[0]做左值时表示数组第0个元素对应的内存空间(连续4字节);

a[0]做右值时表示数组第0个元素的值(也就是数组第0个元素对应的内存空间中存储的那个数)

3、&a,表示数组名a取地址,字面意思是数组的地址(数组的地址就是数组的首地址(也叫数组的起始地址))

&a不能做左值(&a实质是一个常量,不是变量因此不能赋值,所以自然不能做左值。);

&a做右值时表示【整个数组的首地址】

4、&a[0],字面意思就是数组第0个元素的首地址(搞清楚[]和&的优先级,[]的优先级要高于&,所以a先和[]结合再取地址)。

&a[0] 做左值时表示【数组首元素首地址所对应的内存空间】

&a[0] 做右值时等同于a。表示数组首元素的首地址

问题一:

指针格式访问数组元素是:*(指针+偏移量); 如果指针是数组首元素地址(a或者&a[0]),那么偏移量就是下标;指针参与运算的特点是,指针变量+1,并不是真的加1,而是加1*sizeof(指针指向的数据

类型);如果是int *指针,则+1就实际表示地址+4字节,如果是char *指针,则+1就表示地址+1字节;如果是double *指针,则+1就表示地址+8字节.

所以*(&a+2)是一个野指针,值是随机的。a[2]=1095666312

&a是整个数组的首地址,而a是数组首元素的首地址。这两个在数字上是相等的,但是意义不相同。意义不相同会导致他们在参与运算的时候有不同的表现。

问题二:p = &a;类型不匹配的原因

p是int * (指向int类型的指针),而&a是int (*)[3] (指向int数组的指针,也即指向整个数组的首地址)

标签: #c语言判断两数组相等