考核纠错

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值