int main()
{
int a[3][2] = { (0, 1 ), ( 2, 3 ), (4, 5 ) };
int *p;
p = a[0];
printf("%d\n", p[0]);
system("pause");
return 0;
}
输出答案为____.
考核的时候没注意到数组赋初值的时候里头是小括号,导致我做错了,才发现把很基础的逗号表达式给忘记了。
“表达式1,表达式2,……,表达式n”逗号表达式的值为表达式n的值。逗号运算符的结合方向为“从左至右”,运算级别是所有运算符中最低的一种。
所以一开始赋初值相当于a【3】【2】={1,3,5};
所以输出的应该是1。
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1));
system("pause");
return 0;
}
在考核中第二步不知道该怎么理解,经查阅后,(&a+1)的地址是数组a的首地址再加上sizeof(a),
再将这整个地址转化为int型,所以(ptr-1)的地址就是a数组中最后一个元素的地址,所以*(ptr-1)就为5
结构体与共用体最大的区别就是分配内存的不同。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
一、结构体struct
各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。
二、联合体union
各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。不允许对联合体变量名直接赋值或其他操作。
关于const:
下述三个定义有什么区别?
char * const p;
char const * p
第一个为常量指针,p的值不可以被修改。
第二个为指向常量的指针,指向的常量的值不可被修改。
螺旋矩阵
关于EOF:最近正在学习文件,对本来不太熟悉的EOF有了进一步了解,在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。
#include<stdio.h>
int main()
{
int i,j,n;
int a[1000][1000];
int b[1000];
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n*n;i++)
{
scanf("%d",&b[i]);
}
a[n/2+1][n/2+1]=b[0]; //先把中心的数据填上
int y=1;
for(i=1;i<=n/2;i++)
{
for(j=n/2-i+2;j<=n/2+1+i;j++) //向下填充
{
a[j][n/2+i+1]=b[y++];
}
for(j=n/2+i;j>=n/2-i+1;j--) //向左填充
{
a[n/2+i+1][j]=b[y++];
}
for(j=n/2+i;j>=n/2-i+1;j--) //向上填充
{
a[j][n/2-i+1]=b[y++];
}
for(j=n/2-i+2;j<=n/2+1+i;j++) //向右填充
{
a[n/2-i+1][j]=b[y++];
}
}
for(i=1;i<=n;i++) //输出
{
for(j=1;j<=n;j++)
{
if(j==n)
printf("%d\n",a[i][j]);
else
printf("%d\t",a[i][j]);
}
}
printf("\n");
}
return 0;
}