牛客刷题第七天:20191113

  1. 概念:‘ \0’ 是 ASCII码为0 的字符,含义是字符串结束符,即为八位的0000 0000,而 0 是ASCII码为48 的字符,表示数字0,即为0011 0000,所以\0 在内存中就是表示0=NULL的意思。

  2. 牛客刷题第七天:20191113this 指针指向用来调用成员函数的对象。首先,隐含this指针的函数必须为类的成员函数。对于静态函数而言,静态函数属于整个类所有,因此没有this 指针,则只有类的非静态函数有this指针。本题中,f1为类外函数没有this指针,f2属于静态函数,没有this指针,f3属于友元函数,没有this指针。

3.牛客刷题第七天:20191113
解析:难点在于:int *p =(int *)(&intarray +1) .
(1)intarray:为数组的首地址,即intarray[0]的地址,数组名被解释为数组的第一个元素的地址。(2)&intarray 得到的是整个数组的地址。对数组名应用地址运算符的时候,得到的是整个数组的地址。若定义 int (*s)[5] =&intarray 。在这里表示的是s 指向包含5个int 型元素的数组的地址。 &intarray +1 这里增加的相当于整个数组的地址数,也就是5个int 型元素的大小。&intArray + 1 = intArray的首地址 + sizeof(intArray) 此时 p指向数组intArray的末尾的下一个位置处 。p - 1 = p目前指向的地址 - sizeof(p) p指针的内存大小==sizeof(int) 正好是intArray数组里面一个元素的内存大小
结果 p指向intArray数组的倒数第一个元素 。

4.牛客刷题第七天:20191113
解析:(1)大小端模式:小端模式(little-endian),就是数据的低位保存在内存的低地址中,数据的高位保存在内存的高位中,这种存储模式将地址的高低与数据的权位有效地结合起来。高地址部分权值高,低地址部分权值低。大端模式(big-endian),指的是,数据的低位存放在内存的高地址中,数据的高位存放在内存的低地址中。我们常用的x86是小端模式。
牛客刷题第七天:20191113
牛客刷题第七天:20191113
(2)printf函数的用法: 入栈,该函数是元素的最右侧元素先入栈,若入栈的元素char short 等小于4个字节的类型,入栈也占4个字节,大于4个字节的时候,比如long long ,按实际字节入栈,字符串参数入栈的是指向字符串的指针。出栈时,从栈顶输出,每次输出4个字节。
该题目中,
牛客刷题第七天:20191113
1 printf()是一个库函数,C,C++中函数的参数是从右往左入栈的;
2 栈的生长方向是从高往低的
3 小端模式是低位存储在低字节
4 %d格式输出的是4个字节大小,而long long为8个字节
所以,a=1,b=0,c=2
这里还有一个经典的关于union的用法
(1)牛客刷题第七天:20191113
请注意,在这里,unsigned char c1:4 指的是c1 占char(1位8个字节) 的低四位,c2占据高四位,这里u.s是占据一个字节的。u.c = 0xdf. 32位系统中按照小端模式,则c2位置处的值d =13,c1处的值f =15; 改变一下数值类型
牛客刷题第七天:20191113
此时由于是char 类型,c1 处f =1111->(不考虑符号位减一取反)-1,c2处d = 1011->(不考虑符号位减一取反)-3