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语言每一句后面必须要有;
数据类型
只列几个常用的,如果不够用之后再补:
数据类型 | 存储大小 |
---|---|
int | 4字节 |
char | 1字节 |
float | 4字节 |
double | 8字节 |
void
- 函数返回类型为void:
在C语言中,函数可以返回一个值,也可以不返回值。如果一个函数不返回任何值,则可以使用void作为函数的返回类型。例如:
void printHello() {
printf("Hello, World!\n");
}
这个函数不返回任何值,它只是打印"Hello, World!"。如果你尝试在函数中使用return语句,则会发生编译错误。
- 函数参数类型为void:
有时候,一个函数可能不需要任何参数,此时可以使用void表示该函数不需要任何参数。例如:
int getRandomNumber(void) {
return rand();
}
这个函数没有任何参数,它只是返回一个随机数。
- 指针类型为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
只是一个声明,它告诉编译器在其他地方已经定义了一个名为 x
的 int
类型变量,但是并不为这个变量分配内存空间。
因此,在函数内部使用 extern int x
可以让编译器知道 x
的存在,但是并不为它分配内存空间,而实际上的内存分配是在 int x
的定义处进行的。
举个例子,假设在 main
函数内部写了 extern int x
,但是在函数外部没有定义 int x
。那么编译器在编译 main
函数时会认为 x
已经定义,但是并没有为其分配内存空间。当程序运行到 main
函数内部需要使用 x
变量时,由于并没有分配内存空间,就会导致程序崩溃或者出现其他错误。
定义常量
在 C 中,有两种简单的定义常量的方式:
- 使用 #define 预处理器。
- 使用 const 关键字。
例如:
#include <stdio.h>
//方式1
#define WIDTH 5
//方式2
const int LENGTH = 10;
int main(){
printf("WIDTH = %d, LENGTH = %d", WIDTH, LENGTH);
return 0;
}
我的疑问
.与-> (已解决)
"."是结构体成员访问运算符,用于访问结构体变量的成员。例如,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;
}
其中,改变person1.name
和person2.name
效果是一样的,改变任意其一,另一个也会相地进行改变。