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

<inttypes.h> 中有一些跨平台的宏例如 int16_t

<string.h> 包含了字符串的函数比如 strlen

<limits.h> 包含了各种类型的取值范围

<stdbool.h> 包含了 bool true false 的宏定义

<ctype.h> 包含了一些字符判断函数比如 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 <stdio.h>

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 <stdio.h>

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语言,可以使用这种更优雅的赋值方式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 版权声明:本文为 gfson 原创文章,转载请注明出处。注:作者水平有限,文中如有不恰当之处,请予以指正,万分感谢...
    gfson阅读 3,198评论 0 6
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,473评论 3 44
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,407评论 0 2
  • 第1章 第一个C程序第2章 C语言基础第3章 变量和数据类型第4章 顺序结构程序设计第5章 条件结构程序设计第6章...
    小狮子365阅读 10,732评论 3 71
  • 今天团练的主题是收心操,想想让人快速收心最好的办法还是目标的牵引,当目标清晰明确后,制定相应的行动计划。 计划的制...
    阿卢走起阅读 484评论 0 3