- volatile(专一王子)
- 它修饰的变量表示该变量的值很容易由于外部因素发改变,强烈请求编译器要老老实实地在每次对变量进行访问时去内存里读取。
- typedef和#define
- typedef是为一个新类型起新名字,有类型检查
- #define只是简单的字符串替换,无类型检查
- 前者在编译的时候处理,后者在预编译(预处理)的时候处理
typedef char * p_str1;
#define p_str2 char *
p_str1 s1, s2;
p_str2 s3, s4;
typedef char * p_str;
char string[4] = "abc";
const char *p1 = string;
const p_str p2 = string;
p1++;
p2++;
- 浮点变量与零值比较
- 不可将浮点变量用“==”或“!=”与任何数字比较,应该转化成“>=”或“<=”形式。
if ((x >= -EPSINON) && (x <= EPSINON))
若浮点型的精确度为8位,则小数点后8位都是准确的,若float x=0.0,则可取EPSINON=0.00000001
if (m_bool) if (!m_bool)布尔类型
if (0 == m_int) if (m_int != 0) 整型
if (NULL == m_ptr) if (m_ptr != NULL) 指针类型
- 循环语句的效率
- 应该将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
for (cool = 0; col < 5; col++)
{
for (row = 0; row < 100; row++)
{
sum = sum + a[row][col];
}
}
- 在32位平台里指针占了4个字节
- *strings++
[]
++
++ ++, ++++, ++
- array_name 和 &array_name 有什么不同
- 前者是指向数组中第一个元素的指针,后者是指向整个数组的指针
void main()
{
int a[5] = {1,2,3,4,5}
int *ptr = (int *)(&a+1)
printf("%d, %d, %d, %d", *(a+1), *(ptr-1), a, &a)
}
//*(a+1) == 2, *(ptr-1) == 5
//&a 为指向整个数组的指针,&a+1 == &a[5],所以 ptr-1 即为&a[4]
//a == &a[0] == &a
//&a[0]+1 == a+1 != &a+1
int *(a[5]) 和 int *a[5] 都是有5个int型指针的数组
const char *p;
char* const p = a;
char *p = "abc";
#include <stdio.h>
int main()
{
char a[] = "ABCDE";
char b[] = "abcde";
char *p1 = "abcde";
const char *p2 = "abcde";
char * const p3 = p1;
char * const p4 = a;
printf("%d %d %d\n", b, p1, p2);
*p1 = 'A';
*p2 = 'A';
p2 = a;
p3 = 'A';
p3 = a;
p4 = 'A';
return 0;
}