个人
<h2>基础</h2>
<pre><code class="language-c">// -1 存储方式:0xffffffff
// 几种相同的定义
int*p,q;
int* p,q;
int *p,q;
// 本质上都是下面的定义:
int *p;
int q;
void *p;
sizeof(p) // 存储指针所占用的空间大小
char list[1024];
sizeof(list) == 1024
sizeof(&quot;hello&quot;) = 6
strlen(&quot;hello&quot;) = 5
p++ // p 本身加上类型的大小,在 gcc 中 void* 可以自增,变化大小为 1
printf() // 参数是从右往左压栈的
int a = 1;
(int&amp;)a == *(int *)&amp;a
// 判断是否是2的n次方
!(x &amp; (x - 1))
// 用const修饰的变量必须在声明时进行初始化 const int n=5;
const char *p; // 正确(注意这种为什么是正确的),因为这里 const 是修饰 p 指向的变量,而不是指针变量 p 本身
int const a == const int a;
int const *p != int * const p
// 下面的程序最后输出的是 10,10,9,0。
void main(){
int x=10; int y=10, i;
for (i = 0; x &gt; 8; y = i++){
printf(&quot;%d,%d,&quot;, x--, y);
}
}
*p++ // 后置++优先级高于*取值运算符,所以运算后,p会加上一个类型长度的地址
(*p)++
char **p;
p++; //这里自增以后,p在数值上加了一个sizeof(指针)的数字
scanf(&quot;%s&quot;,s); //如果有空格,就会结束
gets(s); //可以接收含空格的字串,不安全
//交换值
a=a^b;
b=a^b;
a=a^b;
// 假定 sizeof(int) = 4;
// (unsigned) int a = 0x01;
则:
a &lt;&lt; 32 == a &lt;&lt; 0 == 1;
a &lt;&lt; 33 == a &lt;&lt; 1 == 2;
// struct 对齐
struct s_t {
char a;
short b;
int c;
};
printf(&quot;%d\n&quot;, sizeof(struct s_t) // 输出 8
</code></pre>
<h2>其它</h2>
<ul>
<li>i++用完i之后立马更新i的值。与for循环区别</li>
<li>类型提升:long double > double > float</li>
<li>#define 没有分号,注意加括号</li>
<li>&引用?</li>
<li>结构体的长度一定是最长数据元素的整数倍。n 字节的元素,它的地址能被 n 整除。</li>
<li>注意 || 和 && 的短路</li>
<li>数组名是一个常量,与指针不同。</li>
<li>在VC++6.0中,void类型指针不能++</li>
</ul>
<h2>数组名</h2>
<p>假设 int a[3]</p>
<ol>
<li>a 和 &a 在数值上相等</li>
<li>&a 是数组指针,指向一个数组,所以 +1 就是加一个数组,大小就是指针的大小</li>
<li>a 是啥?</li>
</ol>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=fd60fcfe54e390955e2beb196fef9c7c&amp;file=file.png" alt="" /></p>