Yulong Niu

个人博客

C语言学习记录

Posted at — Dec 7, 2014

1. 基本数据类型

1.1 算术类型

类型解释说明注意事项本地字节数
short有符号短整数完整形式signed short intsingedint可以省略最左边一位表示符号,0为正数,1为负数2
unsigned short无符号短整数完整形式unsigned short intint可以省略全部位占满2
int有符号整数完整形式signed intsinged可以省略最左边一位表示符号,0为正数,1为负数4
unsigned int无符号整数全部位占满4
long有符号长整数完整形式为signed long intsingedint可以省略最左边一位表示符号,0为正数,1为负数8
unsigned long无符号长整数完整形式为unsigned short intint可以省略全部位占满8
long long无符号长长整数完整形式为signed long long intsingedint可以省略C99特有8
unsigned long long有符号长长整数完整形式为unsigned long long intint可以省略C99特有8
char字符实质是“小整数”(可能比短整数占用字节更少)分为charsinged charunsigned char。使用单引号标记常量,比如'A'为65)1
_Bool布尔型整数实质是无符号整数只能赋值0或1,赋值_Bool类型变量为非零值会导致赋值为11
float单精度浮点数4
double双精度浮点数8
long double扩展精度浮点数16

1.2 数组

数组索引从0开始;数组按行存储。

1.2.1 一维数组

数组长度:

初始化:

1.2.2 多维数组

初始化:

1.2.3 C99变长数组

C99允许声明变长数组。但是,变长数组的声明和初始化不能在一条语句中。正确的做法是:先声明变长数组,之后初始化。比如:

int size;
printf("Enter size of array: ");
scanf("%d", &size);
int square[size];

/* initial square */
for (int i = 0; i < size; i++) {
  square[i] = 0;
}

1.2.4 字符串

字符串长度:

初始化:

1.2.4 字符串数组

初始化:

1.3 结构

结构空间分配:

初始化:

struct test1 {
  int a;
  char b[10];
  int c;
};

struct {
  int a;
  char b[10];
} p3;

/* p1.c is 0 */
struct test1 p1 = {1, "hello"};

/* c99 */
/* p1.a is 0 and p1.c is 3 */
struct test1 p2 = {.b = "world", 3};

/* c99 */
(struct test1){.c = 10};
typedef struct {
   int ele1;
   char ele2;
 } Test1;

typedef union {
  int ele1;
  double ele2;
} Test2;

typedef enum {CIRCLE, RECTANGLE} Test3;

int main(void)
{
  Test1 p1 = {.ele1 = 1};
  Test2 p2 = {.ele2 = 0.2};
  Test3 p3 = CIRCLE;
  
  return 0;
}

1.4 联合

联合空间分配:

初始化:

union test1 {
  int a;
  char b[10];
};

union {
  int a;
  char b[10];
} p3;

union test1 p1 = {0};

/* c99 */
union test1 p2 = {.b = "world"};

/* c99 */
(union test1){.a = 10};
union test {
  int a;
  struct test1 {
    int b1;
    char b2[10];
  } b;
  struct test2 {
    int c1;
    int c2;
  } c;
} t1;

t1.b.b1 = 10;
/* t.c.c1 is 10 */
printf("%d \n", t1.c.c1);

1.5 枚举

初始化:

enum {FIRST, SECOND} p1;
enum test1 {FIRST, SECOND};
enum test1 = SECOND;

1.6 指针

参考C语言指针记录

1.7 函数

1.7.1 函数定义

1.7.2 数组型参数

/* 一维数组长度不是必须 */
int oneArrayFun(int a[], int len) {
...
}

/* 函数声明 */ 
int oneArrayFun(int a[], int len);
/* 省略形参声明 */
int oneArrayFun(int [], int);

/* 实际调用 */
oneArrayFun(testArry, testLen);
/* 比如二维数组,行不是必须,但必须制定列 */
#define COL 10

int twoArrayFun(int a[][COL], int row) {
...
}

/* 函数声明 */ 
int twoArrayFun(int a[][COL], int row);
/* 省略形参声明 */
int twoArrayFun(int [][COL], int);

/* 实际调用 */
twoArrayFun(testArry, testRow);
/* 一维VLA */
int oneArrayFun(int len, int a[len]) {
...
}

/* 一维VLA声明的各种形式 */ 
int oneArrayFun(int len, int a[len]);
int oneArrayFun(int len, int a[*]);
int oneArrayFun(int, int [*]);
int oneArrayFun(int len, int a[]);
int oneArrayFun(int, int []);

/* 实际调用 */
oneArrayFun(testArry, testLen);

/* 二维VLA */
int twoArrayFun(int row, int col, int a[row][col]) {
...
}

/* 二维VLA声明的各种形式 */ 
int twoArrayFun(int row, int col, int a[row][col]); 
int twoArrayFun(int row, int col, int a[*][*]); 
int twoArrayFun(int row, int col, int a[][col]); 
int twoArrayFun(int row, int col, int a[][*]); 
/* 一维数组长度至少为5 */
int oneArrayFun(int a[static 5], int len) {
...
}
#include <stdio.h>

int oneArray(int a[], int len);

int main(void)
{
  printf("Sum is %d. \n", oneArray((int []){1, 2, 3, 4, 5}, 5));

  int i = 1, j = 2, k = 3;
  printf("Sum is %d. \n", oneArray((int [5]){i, j, k}, 5));
  
  printf("Sum is %d. \n", oneArray((int [5]){1, 3, 5, 7}, 4));
  
  printf("Sum is %d. \n",
         constOneArray((const int [5]){1, 1, 1, 1}, 3));
         
  return 0;
}

int oneArray(int a[], int len) {

  int sum = 0;

  for (int i = 0; i < len; i ++) {
    sum += a[i];
  }

  return sum;
}

int constOneArray(const int a[], int len) {

  int sum = 0;

  for (int i = 0; i < len; i ++) {
    sum += a[i];
  }

  return sum;
}

2. 操作符类型和优先级

图片取自参考资料2

3. 表达式

4. 语法注意事项

#ifndef EOF
# define EOF (-1)
#endif
# can not decide whether "++", "=", or "+" is the first
a = i + i++;
i = i++;
a[i] = i++;

# "," is not comma operator
printf("%d %d\n", ++i, i);

5. 标准库

5.1 #include <stdio.h>

printf("%3.0f %6.1f\n", fahr, celsius);

%m.pX:格式串模板,m表示要显示的最小字段宽度,p表示精度,X表示类型。

对于 printf()函数:

对于scanf()函数:

6. C99注意事项

#include <stdbool.h>

int main(void)
{
  bool trueVal = true, falseVal = false;
  
  bool a1[10] = {false};
  
  bool a2[10][10] = {false};

  return 0;
}
#include <stdint.h>

int main(void)
{
  typedef int32_t Int32;

  return 0;
}

参考资料

更新记录

2015年4月30日