tips of c

// size of types in bytes
int          // 4
long         // 4 (8byte on 64bit pc)
short        // 2
unsigned     // 4
float        // 4
double       // 8
char         // 1

中有一些跨平台的宏例如 int16_t

包含了字符串的函数比如 strlen

包含了各种类型的取值范围

包含了 bool true false 的宏定义

包含了一些字符判断函数比如 isdigit


显示相关

  • 科学计数法 %a %A %e %E
  • %c char
  • %d 十进制整数
  • %f float double
  • %o 八进制整数
  • %x 十六进制整数
  • %p 指针
  • %s 字符串
  • %u 无符号十进制整数

%数字.数字控制整数和浮点数的显示位数如%10d 和 %10.2f

用0补充空位 %050d

printf 返回打印的字符数量

scanf 返回获取项目的个数


输入的相关

getchar 获取一个字符包括space tab 和enter

fgets 获取字符串包括space tab 和enter

scanf 获取和规定的格式有关,如果是字符串,那么遇到space tab
和enter都会认为输入完成

例子:

输入 abc空格de回车

fgets 会读入 abc空格de回车

scanf %s 则会是 abc


回车去本行头

换行去下一行的头


func(void);
func();

void明确的表示func不会有参数编译器会检查不写的话代表不确定


const int* p 表示指向常量的指针不能给它指向的东西赋值,对于常量只有这种指针可以指向它

int* const p 表示常指针即不能指向其他东西的指针


指针的运算都会参考它的类型

int *p; p+=2;

p增加的是两个int的大小而不是2

两个指针相减同样得到的是相差几个类型的大小而不是实际地址的差值


int(*p)[5] 

// 定义一个指针它指向由5个整数构成的数组
// 它的加减运算会以5个int大小为一个单位(这个语法不得不说非常诡异) 

int** p

// 定义一个指针它指向另一个指向整数的指针
// 它的加减运算会以一个int类型的指针的大小为一个单位

所以指向二维数组的指针要使用第一种形式

#include 

int main (int argc, const char * argv[]) {
    int arr[5] = { 0, 1, 2, 3, 4 };
    int* p0 = arr;          // 指向整数的指针
    int** p1 = &p0;         // 指向整数指针的指针
    int(*p2)[5] = &arr;     // 指向5个整数构成的数组的指针
    int* p3 = p2[0];        // 指向五个整数中的第一个整数的指针
    printf("%p %p %p %p\n", p0, p1, p2, p3);
    
    p0++; p1++; p2++; p3++;
    printf("%p %p %p %p\n", p0, p1, p2, p3);
    return 0;
}


#include 

void test(int arr[][5]) {
    printf("%d",arr[0][3]);
}

int main (int argc, const char * argv[]) {
    int arr[5] = { 1, 2, 3, 4, 5 };
    int *p = arr;
    printf("%p %p %d\n", arr, p, *arr);

    int arr2[2][3] = { { 1, 2 }, { 3, 4, 5 } };
    // 第一个的最后一个值会被默认填充成0 即 { { 1, 2, 0 }, { 3, 4, 5 } }
    int (*p2)[3] = arr2;
    
    int *p3 = arr2[0];
    int **p4 = &p3;
    printf("%p %p %p %p %d\n", arr2, p2, arr2[0], &arr2[0][0], **p4);
    
    test((int [][5]){ { 0, 1, 2, 3, 4 } });
    
    return 0;
}

整数、浮点数和随机数

两个整数相除会返回一个整数,这个整数是小数截尾的结果

比如 2.5 -> 2 -1.2->-1 -1.7->-1

一个浮点数和一个整数相除,整数会被转换为浮点数然后做除法,所以结果也将是浮点数

rand() // [0, RAND_MAX]

rand() % n // [0, n-1)

(float)rand() / (float)RAND_MAX // [0.0f, 1.0f]

字符串函数

strlen()

strncat()

strcmp() // == return 0

sprintf atoi // 字符串和数字的相互转化 

static 和 extern

static:

  1. 代码块作用域表示该代码块重复执行的时候此变量不变
  2. 文件作用域(全局变量)表示该变量或者函数只在此文件可用即不能在其他文件中使用extern引用

extern:

  1. 声明这个变量或者函数在其他文件定义
int external = 1000;            // 全局变量,默认为外部链接
static int internal = 1000;     // 使用static,声明为内部链接

int main(int argc, const char * argv[]){
    static int local = 1000;    // 局部变量,无链接
    return0;
}

对于数组和结构体的初始化

struct StructA a = { "abc" };
// StructA 有两个成员 只指定一个的话 另一个会变成0
    
int arr[] = { 10, 10, 10 };

int arr2[2] = { 1 };
// 数组也一样 如果初始化的参数不够 那么其他的都被赋成0
// arr2[0] == 1
// arr2[1] == 0

struct StructA a = { .x = "abc", .y = 5 };
// 对于c语言,可以使用这种更优雅的赋值方式

你可能感兴趣的:(tips of c)