int main()
{
short s = 0;
int a = 10;
printf("%d\n",sizeof(s=a+5));
printf("%d\n,s");
}//输出结果为2,0
当 char、short 或 unsigned char 等较小整数类型参与运算时,它们会被自动提升为 int 类型。
示例:
c
char c = 10;
int i = 20;
int result = c + i; // char c 被提升为 int 类型,然后与 int i 相加
当两个操作数类型不同时,会根据一组规则将它们转换为相同类型。
示例:
c
int i = 10;
float f = 20.5;
float result = i + f; // int i 被转为 float 类型,然后与 float f 相加
在赋值操作中,右侧的值会被转换为左侧的类型。
示例:
c
int i = 1000;
char c = i; // int i 被截断为 char 类型,可能导致数据丢失
当调用函数时,如果函数的参数类型与传递的参数类型不匹配,会发生隐式转换。
示例:
c
double calculateAverage(int a, int b) {
return (a + b) / 2.0;
}
int x = 5;
int y = 10;
double avg = calculateAverage(x, y); // 传递的 int 参数会被转换为 double 类型
int* p; *p可以访问4个字节
char* p; *p可以访问1个字节
double* p; \*p可以访问8个字节
int *p
p = 0x11111111
p+2==0x11111119//2*4=8;int\* 可以访问4个字节;对应的int所占4字节
int arr[5]//arr是一个5个元素的整形数组
int *parr1{10}//parr1是一个数组,数组有10个元素,每个元素的类型是int*,parr1是指针数组
int (*parr2)[2]//parr2是一个指针,该指针指向了一个数组,数组有10个元素,每个元素的类型是int-parr2是数组指针
int (*parr3[10])[5]//parr3是一个数组,该数组有10个元素,每个元素是一个数组指针,该数组指针指向的数组有5个元素,每个元素是int
#include
// 定义一个函数
void sayHello() {
printf("Hello, World!\n");
}
int main() {
// 声明一个函数指针,指向无返回值、无参数的函数
void (*funcPtr)();
// 将函数地址赋给函数指针
funcPtr = sayHello;
// 通过函数指针调用函数
funcPtr();
return 0;
}
在这个示例中,funcPtr 是一个指向无返回值、无参数的函数的指针。通过将 sayHello 函数的地址赋给 funcPtr,我们可以通过 funcPtr() 调用 sayHello 函数
#include
void menu()
{
printf("************************\n");
printf("**1.add\t2.sub**\n");
printf("**3.mul\t4.div**\n");
printt("**\t0.exit\t**");
}
int Add(int x,int y)
{
return x+y;
}
int Sub(int x,int y)
{
return x-y;
}
int Mul(int x,int y)
{
return x*y;
}
int Div(int x,int y)
{
return x/y;
}
int main()
{
int input = 0;
int x=0;
int y=0;
int (*pfArr[5])(int,int)={0,Add,Sub,Mul,Div};//转移表
do
{
menu();
printf("请选择:");
scanf("%d",&input);
if(input>=1&&input<=4)
{
printf("请输入两个操作数:");
scanf("%d%d",&x,&y);
int ret = prArr[input](x,y);
printf("%d\n",ret);
}
else if(input==0)
printf("退出");
else
printf("err");
}
}
在程序的主循环中,根据用户输入的选择,通过调用相应的函数来执行加法、减法、乘法或除法操作。这样通过函数指针数组,可以实现根据用户选择动态调用不同的函数,从而实现了代码的灵活性和可扩展性。
#include
// 回调函数的原型
typedef void (*CallbackFunction)(int);
// 接受回调函数作为参数的函数
void performOperation(int data, CallbackFunction callback)
{
printf("Performing operation with data: %d\n", data);
// 调用回调函数
callback(data);
}
// 回调函数示例
void callbackFunction(int result)
{
printf("Callback function called with result: %d\n", result);
}
int main()
{
int data = 10;
// 调用 performOperation,并传递回调函数
performOperation(data, callbackFunction);
return 0;
}
#include
int main()
{
char a=-1;
singned char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}//输出为-1,-1,255
int main()
{
float f = 5.5;
//5.5
//101.1;二进制写法
//(-1)^0*1.011*2^2;IEEE 754写法
//S=0;符号位
//E=2;指数部分,此处加上偏移量127(2^7-1)为129即100000001
//M=1.011;尾数部分
//0 10000001 01100000000000000000000;内存存储数据
}
#include
#include
int main() {
int arr[5]={0};
memset(arr, 1, sizeof(arr));
return 0;
}
//会使得arr内存空间为(0x)01 01 01 01 01 01 01 01 01 01...
#include
#include
#include
int main() {
int *ptr;
int n = 5;
// 分配内存
ptr = (int*)malloc(n * sizeof(int));
if (ptr == NULL) {
printf("%S\n",strerror(errno));//打印错误原因
return 1;
}
// 向分配的内存中写入数据
for (int i = 0; i < n; i++) {
ptr[i] = i + 1;
}
// 打印数据
for (int i = 0; i < n; i++) {
printf("%d ", ptr[i]);
}
// 释放内存
free(ptr);
return 0;
}
#include
#include
int main() {
int *ptr;
// 分配初始内存块
ptr = (int *)malloc(5 * sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed.\n");
return 1;
}
// 重新分配内存块的大小为10个整数
ptr = (int *)realloc(ptr, 10 * sizeof(int));
if (ptr == NULL) {
printf("Memory reallocation failed.\n");
return 1;
}
// 使用重新分配后的内存块
for (int i = 0; i < 10; i++) {
ptr[i] = i;
}
// 释放内存块
free(ptr);
return 0;
}
#include
#include
struct flex_array {
int length;
int data[]; // 柔性数组
};
int main() {
int i;
int array_size = 5;//数组大小
// 分配内存给结构体和柔性数组
struct flex_array *my_array = malloc(sizeof(struct flex_array) + array_size * sizeof(int));
my_array->length = array_size;
// 初始化数组
for (i = 0; i < array_size; i++) {
my_array->data[i] = i * 10;
}
// 访问和打印数组元素
for (i = 0; i < my_array->length; i++) {
printf("Element %d: %d\n", i, my_array->data[i]);
}
// 释放内存
free(my_array);
return 0;
}
#include
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file.\n");
return 1;
}
// 文件操作...
fclose(file);
return 0;
}
//读文件
#include
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file.\n");
return 1;
}
int num;
fscanf(file, "%d", &num);
printf("Read number: %d\n", num);
fclose(file);
return 0;
}
//写文件
#include
int main() {
FILE *file = fopen("example.txt", "w");
if (file == NULL) {
printf("Error opening file.\n");
return 1;
}
fprintf(file, "Hello, World!\n");
fclose(file);
return 0;
}
#include
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file.\n");
return 1;
}
fseek(file, 0, SEEK_END); // 将文件指针移动到文件末尾
// 获取文件大小
long size = ftell(file);
printf("File size: %ld bytes\n", size);
fclose(file);
return 0;
}
#include
int main() {
if (remove("example.txt") == 0) {
printf("File deleted successfully.\n");
} else {
printf("Error deleting file.\n");
}
return 0;
}
编辑(Edit): 程序员编写源代码文件,通常使用文本编辑器来编写代码。这个阶段主要是编写代码并保存在文件中。
预处理(Preprocess): 在编译之前,源代码会经过预处理器处理。预处理器会执行一些指令,比如#include、#define等,将宏展开,处理条件编译等操作。
编译(Compile): 预处理完成后,源代码会被编译器翻译成机器能够执行的目标代码(通常是机器码或者中间代码)。编译器会检查代码的语法和语义,生成可执行文件。
链接(Link): 如果程序中包含了其他库函数或者模块,编译器会将这些模块连接到程序中,生成最终的可执行文件。链接器会解析符号引用,将不同模块之间的引用关系解决。
加载(Load): 可执行文件被加载到内存中,操作系统会为程序分配内存空间,并将程序加载到内存中准备执行。
执行(Execute): 程序开始在计算机上执行,按照代码的逻辑顺序执行各个语句,直至程序运行结束。
管道(Pipes):管道是一种常见的进程间通信机制,可以在父子进程或者兄弟进程之间进行通信。在Windows中,可以使用匿名管道或命名管道。
共享内存(Shared Memory):通过共享内存,不同进程可以访问同一块内存区域,实现数据共享。
信号量(Semaphores):信号量用于控制多个进程对共享资源的访问,可以通过信号量来同步进程的操作。
消息队列(Message Queues):消息队列可以用来在进程之间传递消息,实现进程间通信。
套接字(Sockets):套接字通常用于网络编程,但也可以在同一台计算机的不同进程之间进行通信。
//管道方法
//父进程
#include
#include
#define BUFFER_SIZE 25
int main()
{
HANDLE ReadHandle, WriteHandle;
STARTUPINFO si;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
char message[BUFFER_SIZE] = "Hello from parent process!";
DWORD written;
// 设置安全属性
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
// 创建管道
if (!CreatePipe(&ReadHandle, &WriteHandle, &sa, 0))
{
fprintf(stderr, "Create Pipe Failed");
return 1;
}
// 设置启动信息
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.hStdOutput = WriteHandle;
si.dwFlags = STARTF_USESTDHANDLES;
// 创建子进程
CreateProcess(NULL, "child_process.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
// 父进程写入消息
WriteFile(WriteHandle, message, BUFFER_SIZE, &written, NULL);
printf("Parent wrote: %s\n", message);
// 等待子进程结束
WaitForSingleObject(pi.hProcess, INFINITE);
// 关闭句柄
CloseHandle(WriteHandle);
CloseHandle(ReadHandle);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
//子进程
//子进程的可执行文件命名为child_process.exe
#include
#include
#define BUFFER_SIZE 25
int main()
{
HANDLE ReadHandle;
STARTUPINFO si;
PROCESS_INFORMATION pi;
char message[BUFFER_SIZE];
DWORD read;
// 获取父进程传递的管道句柄
ReadHandle = GetStdHandle(STD_INPUT_HANDLE);
// 从管道中读取消息
ReadFile(ReadHandle, message, BUFFER_SIZE, &read, NULL);
printf("Child received: %s\n", message);
return 0;
}