C语言基础语法 2023-3-18

47 阅读6分钟

hello, world!

C 程序主要包括以下部分:

  • 预处理器指令
  • 函数
  • 变量
  • 语句 & 表达式
  • 注释
#include <stdio.h> 
int main() 
{ 
/* 我的第一个 C 程序 */ 
    printf("Hello, World! \n"); 
    return 0; 
}

编译执行指令:

gcc hello.c

预处理器指令:

<stdio.h> 是 C 标准库中的一个头文件,其中包含了进行输入输出操作所需的函数和常量的定义,如 printf()scanf()。这些函数和常量的定义在编译时需要被解析,因此在代码中需要包含头文件。

使用 #include <stdio.h> 告诉编译器在编译过程中需要引入这个头文件。如果不包含该头文件,则编译器在编译时无法识别 printf()scanf() 等函数的定义,从而导致编译错误。

在 C 语言中,写入 #include <stdio.h> 是一种良好的习惯,因为它可以让你在程序中使用标准输入输出函数,如 printf()scanf(),而不必手动编写这些函数的定义。

除了 #include <stdio.h>,还有其他的写法可以引入头文件,例如 #include "filename.h",这种写法会先在当前目录下搜索文件 filename.h,如果找不到,再在编译器预定义的系统路径中搜索。这种写法常用于引入自定义头文件。

基础语法

c语言的注释就是那两种,//和/**/。

c语言区分大小写。

c语言每一句后面必须要有;

标识符查询

数据类型

只列几个常用的,如果不够用之后再补:

数据类型存储大小
int4字节
char1字节
float4字节
double8字节

void

  1. 函数返回类型为void:

在C语言中,函数可以返回一个值,也可以不返回值。如果一个函数不返回任何值,则可以使用void作为函数的返回类型。例如:

void printHello() {
    printf("Hello, World!\n");
}

这个函数不返回任何值,它只是打印"Hello, World!"。如果你尝试在函数中使用return语句,则会发生编译错误。

  1. 函数参数类型为void:

有时候,一个函数可能不需要任何参数,此时可以使用void表示该函数不需要任何参数。例如:

int getRandomNumber(void) {
    return rand();
}

这个函数没有任何参数,它只是返回一个随机数。

  1. 指针类型为void:

在C语言中,void指针可以指向任何类型的数据,但是不能对void指针进行解引用操作,因为不知道指针所指向的数据类型。例如:

void* ptr;
int a = 10;
ptr = &a;  // void指针指向int类型的数据

在上面的例子中,ptr是一个void指针,它指向一个int类型的变量a。

设置void数据类型的原因是,它可以表示不同类型的数据,使得函数能够处理不同类型的参数和返回不同类型的值。在使用void指针时,可以将不同类型的指针赋值给void指针,这样可以实现更灵活的数据类型转换。但是,需要注意的是,使用void指针时需要非常小心,因为指针解引用时无法确定指针所指向的数据类型,容易出现类型不匹配的错误。

类型转换

有两种:隐式和显式。

隐式类型转换实例:

int i = 10;  
float f = 3.14;  
double d = i + f; // 隐式将int类型转换为double类型

显式类型转换实例:

double d = 3.14159;  
int i = (int)d; // 显式将double类型转换为int类型

变量的声明

变量的声明有两种情况:

  • 1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
  • 2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
  • 除非有extern关键字,否则都是变量的定义。
extern int i; //声明,不是定义
int i; //声明,也是定义

自己写的一段:

#include <stdio.h>

int x;
int y;
int add(){
    extern int x;
    extern int y;

    x = 1;
    y = 2;

    return x+y;
}

int main(){
    int c;
    c = add();
    printf("c = %d", c);
    return 0;
}

我犯了一个错误,就是没有在函数外去定义int x;int y;

在此处:

如果在函数内部使用了 extern int x,那么在函数外部必须要有 int x 的声明。这是因为 extern int x 只是一个声明,它告诉编译器在其他地方已经定义了一个名为 xint 类型变量,但是并不为这个变量分配内存空间。

因此,在函数内部使用 extern int x 可以让编译器知道 x 的存在,但是并不为它分配内存空间,而实际上的内存分配是在 int x 的定义处进行的。

举个例子,假设在 main 函数内部写了 extern int x,但是在函数外部没有定义 int x。那么编译器在编译 main 函数时会认为 x 已经定义,但是并没有为其分配内存空间。当程序运行到 main 函数内部需要使用 x 变量时,由于并没有分配内存空间,就会导致程序崩溃或者出现其他错误。

定义常量

在 C 中,有两种简单的定义常量的方式:

  1. 使用  #define 预处理器。
  2. 使用 const 关键字。

例如:

#include <stdio.h>
//方式1
#define WIDTH 5
//方式2
const int LENGTH = 10;

int main(){
    printf("WIDTH = %d, LENGTH = %d", WIDTH, LENGTH);
    return 0;
}

image.png

我的疑问

.与-> (已解决)

"."是结构体成员访问运算符,用于访问结构体变量的成员。例如,person1.age表示访问person1结构体变量的age成员。

"->"是结构体指针成员访问运算符,用于访问指向结构体的指针变量的成员。例如,person2->age表示访问person2指针变量所指向的结构体的age成员。

例如:

#include <stdio.h>

struct Person {
    char name[20];
    int age;
};

int main() {
    // 定义结构体变量
    struct Person person1 = {"Alice", 20};
    printf("person1's name is %s, age is %d\n", person1.name, person1.age);

    // 定义结构体指针变量
    struct Person *person2 = &person1;
    printf("person2's name is %s, age is %d\n", person2->name, person2->age);

    // 修改结构体变量的成员
    person1.age = 21;
    printf("person1's new age is %d\n", person1.age);
    printf("aaperson1's new age is %d\n", person2->age);

    // 修改结构体指针变量所指向的结构体变量的成员
    person2->age = 22;
    printf("person2's new age is %d\n", person2->age);
    printf("person1's age is also changed to %d\n", person1.age);

    return 0;
}

image.png

其中,改变person1.nameperson2.name效果是一样的,改变任意其一,另一个也会相地进行改变。