C语言作业-Day9

写作能力有限,请多多包含( $ _ $ )
如有错误理解,请指出文中有误的地方。(可以私信)
一、选择题 
1、下列程序的输出是( )
A: 上述程序有错误     B: 6     C: 8     D: 12
#include<stdio.h>
int main()
{
  int a [12]= {1,2,3,4,5,6,7,8,9,10,11,12},*p[4],i;
  for(i=0;i<4;i++)
    p[i]=&a [i*3];
  printf("%d\n",p[3][2]);
  return 0;
}
  • 二维数组可以看做是一维数组的一维数组,由a[m]=a+m ; a[m][n]=a[m]+n=(a+m)+n 可知,p[3][2]=p[3]+2,因为p是指针,所以p[3]+2代表指针p[3]的偏移量,结合p[3]=&a[9]可知,结果为12(a[11])

  • int *p[4]: p 是指针数组, 数组内包含 4 个元素, 每个元素都是 int* 类型。经过for循环 p[i]=&a [i*3]后,其内部的四个元素分别指向a[0],a[3],a[6],a[9],结束循环后,打印p[3][2]的值。
  • 首先p数组是里面有4个元素,每个元素的值都是一个地址,p[3]指向a[9],其实p[3]可以类似看成指向“子”数组[10,11,12]的第一个元素的地址。那如果把该三个元素组成的数组取名b[],即b[3]={10,11,12},既然p3是该数组的首地址,那么p[3][2]指向b[2],即a[11].

  • p[3][2] = p[3]+2, p[3] 是 int* 类型, 偏移 2 个单位后指向 a[11]

答案:D

2、二维数组X按行顺序存储,其中每个元素占1个存储单元。若 X[4][4] 的存储地址为Oxf8b82140 , X[9][9]的存储地 址为Oxf8b8221c ,则 X[7][7] 的存储地址为( )

A: Oxf8b821c4     B: Oxf8b821a6     C: Oxf8b82198     D: Oxf8b821c0

答案:A

  • 方法一:
  • 根据题意不知道该数组每行到底多少个元素,此时设每行元素为n个。即可列出X[9][9] - X[4][4]的等式方程为:21c (十进制:540) - 140(十进制:320) = 4n + (n - 4) + 9;解得 n = 43。此时x[7][7]的地址是z,所以x[7][7]和x[9][9]地址的距离为:21c - z = 43 + 9 + 43 - 7;解得 z = 1c4(十进制:452)
  • 方法二:

  • x[4][4]这个元素的地址是Oxf8b82140,则x[4][9]的地址是Oxf8b82140+5 = Oxf8b82145,它与x[9][9]这个元素刚好差5行,所以每行的元素个数为( Oxf8b8221c- Oxf8b82145)/5=d7(十进制245)/5=43,所以x[7][9]的地址是x[4][9]+3*43(十六进制81)= Oxf8b821c6,x[7][7]的地址=x[7][9-2]= Oxf8b821c4。

3、以下哪个选项可以正确描述 sizeof(double) ( )

A: 一个整型表达式     B: 一个双精度型表达式     C: 一个不合法的表达式     D: 一种函数调用
答案:A
  • sizeof()是一个操作符,不是函数调用,它将返回一个无符号的整形数据。因此可以将其看成一个无符号整形的表达式。
  • sizeof()返回一个对象或类型所占的内存字节数。
4、下列代码运行后的结果是什么( )
A: b,b     B: b,c     C: a,b     D: a,c
int main()
{
    char a = 'a',b;
    printf("%c,", ++a);
    printf("%c\n", b = a++);
    return 0;
}

答案:A

  • ①前置++,保留的是++后的值;    ②后置++,保留的是当前值
  • char a = 'a',b;  申请了字符变量a里边存的是字符'a',申请了字符变量b,第一次输出先加加再输出,字符'a'的ASCII码是97,加1为97,对应着'b',故输出为'b'。第二次输出的时候,a先赋值再加加,赋值给b的就是a原来的值,输出b的时候的还是'b'

5、以下逗号表达式的值为( ) 

(x = 4 * 5 , x * 5) , x + 5;

A: 25     B: 20    C: 100    D: 45

答案:A

  • 逗号表达式是从前到后依次计算子表达式,而其结果是最后一项的值,此题去掉括号后的表达式,和原表达式是等价的,先计算4*5并赋值给x,x变为20,中间x*5并没有改变x的值,最后一项x+5值是25,也就是整个表达式的值 
二、编程题
 1、728. 自除数 - 力扣(LeetCode)

int* selfDividingNumbers(int left, int right, int* returnSize) 
{
    int *ret =(int*)calloc(1000,sizeof(int));//动态申请内存空间
    *returnSize=0;
    for(int i=left;i<=right;i++)
    {
        int num=i;
        while(num)
        {
            int a=num%10;//计算余数
            if(a==0||(i%a)!=0)//判断i自身与余数取模是否为0
            {
                break;
            }
            num/=10;
        }
        //如果num==0表示通过了每一位数的取模判断,则i就是自除数
        if(num==0)
        ret[(*returnSize)++]=i;
    }
    return ret;   
}
2、238. 除自身以外数组的乘积 - 力扣(LeetCode)

int* productExceptSelf(int* nums, int numsSize, int* returnSize){
    int * ret=(int *)malloc(numsSize * sizeof(int));
    * returnSize=numsSize;
    int left=1,right=1;
    for(int i=0;i<numsSize;i++)
    {
        ret[i]=left;
        left *=nums[i];
    }
    for(int i=numsSize-1;i>=0;i--)
    {
        ret[i] *=right;
        right *=nums[i];
    }
    return ret;
}

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值