写作能力有限,请多多包含( $ _ $ )
如有错误理解,请指出文中有误的地方。(可以私信)
一、选择题
#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
- sizeof()是一个操作符,不是函数调用,它将返回一个无符号的整形数据。因此可以将其看成一个无符号整形的表达式。
- sizeof()返回一个对象或类型所占的内存字节数。
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;
}