结构体声明:
struct classA {...}; // struct classA x1;
typedef struct {...} classB; // classB x2;
typedef struct classA {...} classC; // classC x3; <==> struct classA x3;
classA的定义必须加struct结构标签;用typedef进行类型定以后,classB可直接用于定义;classC的定义两种方法均可使用。
文件读写结构体:
fwrite(&somestruct, sizeof somestruct, 1, fp);
fread(&somestruct, sizeof somestruct, 1, fp);
不需要临时变量,交换a,b值
// 根据方法 1,同理可推出其他方式
a = a + b;
b = a - b;
a = a - b;
后缀++和--操作符比前缀一元操作符高
*p ++; // 等价于 *(p++)
C语言中没有通用的指针类型
// 用void **通用指针作为参数,但不可移植
void func(void **);
double *dp;
func((void **)&dp);
char a[] 和 char *p不等价
char a[] = "hello"; // a 即为"hello"字符串 , a[i] = 'p' 可以更改
char *p = "world"; // p 存取"world"的地址 , p[i] = 'p' 不可更改 , 属于无名的静态数组
调用free()后,指针指向的内存被释放,但指针并没有置空,最后在释放之后立即将它们置为NULL,以明确状态。
sizeof()不能告知指针所指内存的大小,只能得到指针本身的大小。实际上,没有什么可移植的方法得到malloc()函数分配的内存块大小。
calloc()和malloc()的区别:
p = calloc(m, n);
<==>
p = malloc( m * n );
memset(p, 0, m * n);
C语言中字符常量是int类型,与C++不同,C++中为char类型
int conLen = sizeof('a') ; // 4
int intLen = sizeof(int); // 4
int charLen = sizeof(char); // 1
// 前两个可以互换,表示*p的值为可读
// 第三个指的是指针p不可修改,属于指针常量
const char *p;
char const *p;
char * const p;
把stdin或stdout重定向到文件,stdout/stdin为常量,因此不能进行赋值;一旦使用freopen后,无法恢复到原来的stdout/stdin,因此最好一开始就不要用
FILE *saveStdout = stdout;
freopen(fileName, "w", stdout);
stdout = fopen(fileName, "w"); // wrong
stdout = saveStdout; // wrong