摘要:
SPI的四种工作模式,由极性和相位组合而成。芯片手册中极性和相位分别表示为CPOL(Clock POLarity)和CPHA(Clock PHAse)。 模式 CPOL CPHA MODE0 0 0 MODE1 0 1 MODE2 1 0 MODE3 1 1 CPOL:SPI空闲的时钟信号电平。(1 阅读全文
摘要:
1 #include <stdio.h> 2 3 void foo(void) 4 { 5 unsigned int a = 6; 6 int b = -20; 7 (a+b>6)?puts(">6"):puts("<6"); 8 } 9 10 int main(void) 11 { 12 foo( 阅读全文
摘要:
先看下面的例子: int a[5]; 所有人定明白这里定义了一个数组,其包含了5个int型的数据。我们可以用 a[0]、a[1]等来访问数组里面的每一个元素,那么这些元素的名字就是a[0]、a[1]...吗? 如图所示,当我们定义一个数组a时,编译器根据指定的元素个数和元素类型分配确定大小(元素类型 阅读全文
摘要:
简单而言,出现在赋值符“=”右边的就是右值,出现在赋值符“=”左边的就是左值。 比如,x=y。 左值:在这个上下文环境中,编译器认为x的含义是x所代表的地址。这个地址只有编译器知道,在编译的时候确定,编译器在一个特定的区域保存这个地址,我们完全不必考虑这个地址保存在哪里。 右值:在这个上下文环境中, 阅读全文
摘要:
这里 &a[0] 和 &a 到底是什么区别呢? a[0]是一个元素,a是整个数组,虽然&a[0] 和 &a 的值一样,但其意义不一样。前者是数组首元素的首地址,而后者数数组的首地址。 举个例子:湖南的省政府在长沙,而长沙的市政府也在长沙。两个政府都在长沙,但其代表的意义完全不同。 阅读全文
摘要:
假设现在需要往内存地址0x12ff7c上存入一个整型数0x100,那么怎样才能做到呢? 我们知道可以通过一个指针向其指向的内存地址写入数据,那么这里的内存地址0x12ff7c其本质不就是一个指针嘛,所以我们可以用下面的方法: int *p = (int *)0x12ff7c; *p = 0x100; 阅读全文
摘要:
很多初学者搜无法分清这两者之间的区别。先看下面的代码: int *p = NULL; 这时候我们可以通过调试器查看p的值为0x00000000。这句代码的意思是:定义一个指针变量p,其指向的内存里面保存的是int类型的数据;在定义变量p的同时,把p的值设置为0x00000000,而不是把*p的值设置 阅读全文
摘要:
指针变量p前的“*”号作用? 这里这个“*”号怎么理解呢?举个例子:当你回到家门口时,你想进屋第1件事就是拿出钥匙来开锁,试想防盗门的锁芯是不是很像这个“*”号?你要进屋必须要用钥匙,试想防盗门的锁芯是不是很像这个“*”号?你要进入必须要用钥匙,那你去读/写一块内存是不是也要一把钥匙呢?这个“*”号 阅读全文
摘要:
指针的内存布局 先看下面的例子 int *p; 大家都知道这是定义了一个指针p,但是p到底是什么东西呢?还记得第1章里说过“任何数据类型我们都可以把它当成一个模子”吗?p,毫无疑问,是某个模子“咔”出来的。我们也讨论过,任何模子都必须有特定的大小,这样才能“咔咔咔”。那“咔”出p这个模子到底是什么样 阅读全文