x210-2021-08-25
1、if(0):条件判断为假,if(-1):条件判断为真(因为-1为非零数)。
2、A||B不等于B||A(同样的,&&也遵循),因为只要运算符左侧的条件能够得出结论时,就不会再判断右侧条件,所以交换操作数A和B所得到的表达式是不等同的。
3、不引入第三个变量的情况下实现将两个数进行交换(采用异或),需要执行下面三句:
(1)a = a^b;
(2)b = a^b;
(3)a = a^b;
4、地址访问:->,变量访问:.。
5、想要查看一个浮点数在内存中存储的样子,可以采用以下办法(下面以常见的3.14来举例),因为一个浮点数占用4个字节,所以读取的时候选择用int来一次获取所有4个字节内容,虽然可以用%d来打印int中内容,但是因为十进制数不够直观,所以选择采用更接近于机器而人又能一目了然的十六进制%x来打印,另外需要说明的就是,关于警告问题,因为是编译器发现读取格式(int)和存储内容格式(float)不一致,所以进行的警告:
6、const char *p多数应用在字符串,char *const p多数应用在硬件资源(存储地址一般不再发生改变,里头存储的内容可以被读写和更新,如显存)。
7、指针也有一个类似数组名加索引的表达形式,两者可以等价使用。
8、二级指针一个最容易接触到的地方就是main函数的参数列表,下面图一示例是在有参数个数形参argc存在的情况下对传入参数argv的打印(并且需要注意传入参数类型不得超过char范围),如果在某些特殊情况下,例如参数个数argc不告知的情况,那么就需要通过argv本身的一个特点来开启打印并结束循环,那就是判断参数是否为空,如果为空说明已经到达末尾,需要告知编译器结束循环了,如图二,但这个还不是使用二级指针的最重要原因,二级指针的最重要目的是顺序存储用户输入的编译参数,argv:用户定义的指针变量(存储着另一个指针变量的门牌号),*argv:第一次解析(找到门牌号所指向的内存空间并取出其中的内容,也就是“另一个指针变量”),**argv:第二次解析(找到“另一个指针变量”所指向的内存空间并取出其中的内容,也就是“用户输入的编译参数”),三者的关系简单概括为:指针变量门牌号-指针变量-用户编译参数,其中,在指针变量阶段,就可以通过加1减1操作找到相邻的、下一个存储着用户编译参数的指针变量。