C Tips:需要注意的地方

结构体声明:

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章