输出:
2 3 -9
解析:
本题考察对数组名的理解
首先数组名表示数组首元素的地址,其次数组中的元素在内存空间中是连续的。
第一个nums[1][-2],相当于*(*(nums + 1) - 2)
在C中,指针加1指的是增加一个存储单元。
对数组而言,这意味着加1后的地址是下一个元素的地址。
想要把这个表达式讲清楚很简单,但是初学C语言的时候要突然接受内存地址这样一个新内容并不容易。
可以反复多次的看《c primer plus》 10.3 指针和数组
输出:
24
4 8
8 6
解析:
24:sizeof(a),求数组大小,3×2×4=24
4:sizeof(a[1][1] = 0),一个int的大小,4
8:a[1][1],数组中第二行第二列的元素,8
8:sizeof(str),注意这里的str是一个字符指针,而不是字符数组,因此得到的值应该是指针的大小,而不是字符串的大小。指针的大小与操作系统有关,64位是8字节,32位是4字节。
6:strlen(str),strlen()函数获得字符串的长度,不包括结尾’\0’
关于本题的字符串:"\0101\xb2",转换成字符数组的话应该长这样:
{'\b','1','\','x','b','2','\0'}
不包括结尾0,因此strlen(str) == 6
输出:
a = 2018, b = 1
a = 2019, b = 2
a = 2020, b = 3
解析:
static int a = 2018;
这里定义的a为内部链接的全局变量,即只可在本文件内使用的变量。
static int b;
这里定义的b为静态局部变量,即在函数调用结束之后并不会释放这个变量的内存,只可在本函数内使用。
可以详细阅读《c primer plus》 12.1 存储类别
(1)与(4)错误
解析:
本题考察对 指向const的指针 与 const指针 的理解
https://www.cnblogs.com/qxj511/p/4965793.html
char * const p1 是const指针:即指针指向的地址是固定不可改变的
const char * p2 是指向const的指针:即指针所指向的内容不可变,但可以使用其他指向本内存的指针来进行更改
(1):p1是const指针,指向的地址不可更改
(2):p2是指向const 的指针,所指向内存的内容不可更改
输出(每次输出的值都不会相同,大家注意自己的输出即可):
0x7ffe398614b0
0x7ffe398614b4
0x7ffe398614b0
0x7ffe398614c4
第一个a:指向数组首元素的指针
第二个a+1:表示指向数组第二个元素的指针
第三个&a:指向整个数组的指针,虽然值与首元素的地址相同,但是表示的粒度不同
第四个&a+1:由于&a的类型是指向整个数组的指针,因此&a+1是以整个数组为粒度,所以&a加1时,地址加20,使用十六进制表示出来就是b0—>c4
输出:
7
解析:
可以看到每次按位与运算后,二进制中的1会少一个,直到最后为0时退出循环
输出:
7
XiyouLinuxGroup YEAR
XiyouLinuxGroup 2018
解析:
MULTIPLY(1 + 2, 3)—>1+2*3=7
LEVELONE(YEAR) "XiyouLinuxGroup “#x”\n"中因为x前含有#,所以不展开参数,输出XiyouLinuxGroup YEAR
LEVELTWO(YEAR)—>LEVELONE(2018)—>XiyouLinuxGroup 2018
输出:
16 24
解析:
本题考察内存对齐
关于内存对齐其实只需要理解掌握一个规律即可:
各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数
例:struct icd
sizeof(int) == 4 —>起始位置为0,是4的倍数,则分配4字节
sizeof(char) == 1 —>起始位置为4,是1的倍数,则分配1字节
sizeof(double) == 8 —>起始位置为5,不是8的倍数,则补充3个字节,此时起始位置为8,是8的倍数,则分配8字节
因此,sizeof(struct icd) == 4+1+3+8 == 16
struct cdi同理
参考:https://www.cnblogs.com/wuyudong/p/memory-alignment.html
解析:
- 若想要通过形参修改一个变量的值,则必须使用比此变量高一级的指针
- 字符指针不可以通过strcpy进行赋值
接下来还有两道编程题本文就不放代码了,大家感兴趣可以自己试一试