我很难理解C中数组名称的类型和用法.这可能看起来很长,但请耐心等待.
我理解以下语句声明a是类型,int []即整数数组.
int a[30];
Run Code Online (Sandbox Code Playgroud)
同时a也指出数组的第一个元素和类似*(a+2)的东西是有效的.因此,a看起来像一个指向整数的指针.但实际上类型int []和int*不同; 前者是数组类型,后来是指向整数的 指针.
类型int []变量int*在传递给函数时也会转换为类型变量; 因为C数组是通过引用传递的(sizeof运算符除外).
这就是让我垂涎的观点.看看下面这段代码:
int main()
{
int (*p)[3];
int a[3] = { 5, 4, 6 };
p = &a;
printf("a:%d\t&a:%d\n",a,&a);
printf("%d",*(*p + 2));
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
a:2686720 &a:2686720
6
Run Code Online (Sandbox Code Playgroud)
那么,上面的代码是如何工作的呢?我有两个问题:
a并&a具有相同的值.为什么?int (*p)[3];做什么的?它声明了一个 …我在比赛问题文件中找到了这个程序:
#include <iostream>
void main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int*)(&a + 1);
printf("%d %d ",*(a + 1), *(ptr - 1));
}
Run Code Online (Sandbox Code Playgroud)
输出是 2 5
现在,当我将第5行更改为int *ptr=(int*)(&a);和printf("%d %d ",*(a + 1), *(ptr));
输出变成了 2 1
在第一种情况下ptr得到了最后一个地址,array+1在第二种情况下ptr得到了相同的数组地址(地址a).
我怀疑的是,为什么这个赋值在a递增并分配给时ptr以及何时a赋值ptr而不递增时显示不同类型的行为?