数组相关问题
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int arr[] = { 1,2,3 }; //数组如果初始化的话,可以不指定大小,会根据初始化的内容自动确定大小 /* c99标准之前数组的大小不能是变量的 但是在c99标准之后引入了变长数组的概念 这时允许数组的大小时变量,但是不可以初始化 */ return 0; }
C99新增标准
C99是C语言的一个新标准,于1999年发布。相对于之前的C89标准,C99引入了一些新特性,包括:
1. 布尔类型:C99标准引入了bool类型,可以用true和false来表示布尔值,这是一种非常方便的数据类型,可以简化代码的编写。
2. 复合字面量:C99标准允许使用复合字面量,即同时初始化多个类型不同的值,使用花括号来表示。这种特性可以简化代码的编写,让代码更加紧凑。
3. 变长数组:C99允许使用变长数组,即数组长度可以在运行时动态地分配。这种特性可以提高程序的灵活性,让程序更加适应不同的数据需求。
4. for循环的扩展:C99允许在for循环中声明循环变量,这种特性可以简化代码的编写,提高代码的可读性。
5. 更多的注释方式:C99允许使用//的注释方式,这种注释方式可以在行末添加注释,方便代码的编写和阅读。
总之,C99标准引入了一些新的特性,包括布尔类型、复合字面量、变长数组、for循环的扩展、更多的注释方式等,使C语言编程更加方便、灵活和高效。
两个数的最大值
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int Max(int x, int y) { return x > y ? x : y; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); //求较大值 int m = Max(a, b); printf("%d\n", m); return 0; }
内存
内存是计算机中一种临时数据存储器,它通过电子元件存储数据,可以快速对数据进行读写操作,是计算机系统中至关重要的组成部分之一。
内存可以分为静态内存(SRAM)和动态内存(DRAM)两种类型。静态内存存储器中的数据可以持续保存,但其价格较高,容量较小。而动态内存中的数据需要每隔一定时间进行刷新,否则数据会丢失,但其价格比静态内存低,容量更大。
内存的内部结构是非常复杂的,一般来说,内存由若干个内存芯片构成,其数量和容量决定了整个内存的大小。电脑内存的单位是字节(Byte),1Byte等于8个二进制位(bit)。
内存的速度也是很重要的,一般用内存频率(MHz或MT/s)来表示。高速内存可以提供更高的读写速度,从而使计算机系统更加高效运行。内存的使用方式以及内存容量也决定了计算机的运行效率。操作系统和程序可以在内存中运行,内存过小容易导致计算机变慢或者系统崩溃,
因此,提高内存容量可以让计算机更好地处理更多任务和运行更复杂的程序。
指针
指针是一种变量类型,它存储内存地址,即指向内存中某个具体位置的数字。指针可以指向任何数据类型的变量,包括基本数据类型、数组、结构体等。
指针变量本身也有一个地址,而指向指针变量的指针称为二级指针或多级指针,以此类推。
指针的使用可以分为四种基本操作:定义指针变量、为指针变量赋值、通过指针访问所指向的值和使用指针访问数组元素。
指针的定义需要指定指针所指向的数据类型,即通过“* ”符号指定。
例如,定义一个指向整型变量的指针:
int* p;
这里的“* ”符号表示p是一个指针变量,指向一个整型变量。
指针的赋值可以通过给指针变量赋值一个内存地址来实现。
例如,将p指向一个整型变量x的地址:
int x = 10; p = &x;
这里的& 符号表示取地址,即将x的地址赋值给指针变量p。通过指针访问所指向的值可以使用“* ”符号。
例如,通过p指针访问x的值:
int y = *p;
这里的“* ”符号表示解引用,即获取指针指向的内存地址中存储的数据。
使用指针访问数组元素可以通过指针和下标的组合实现。
例如,定义一个指向整型数组的指针:
```int arr[3] = { 1, 2, 3 }; int* pArr = arr; ```
这里的pArr指向整型数组arr的第一个元素。我们可以使用指针和下标的组合访问数组元素:
int x = *(pArr + 1); // 获取arr[1]的值,即2
这里的“+1”表示增加一个整型变量的大小,即指向arr[1]的地址。
指针的使用需要注意一些安全性问题,例如指针越界访问、未初始化指针的使用等,这些问题可能导致程序出现运行时错误,甚至影响系统的稳定性。因此,程序员在使用指针时需要注意使用方式和注意事项。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int a = 15; //a的地址:0x000000155CCFFA74 //a在内存中的数据显示:0f 00 00 00 //a是int类型 //所以向内存申请了4个字节的空间 //用来存放15这个数值 //虽然a占有四个字节,但是当我们&地址的时候\ 拿到的是4个字节中第一个字节的地址 int* p = &a; //p是一个指针变量,指向a的地址 *p;//获取a变量的值 //指针变量大小 /* 指针变量是用来存放地址的 32位机器上:地址是32个二进制位,这个地址要存储的话要4个字节 所以在32位机器上,指针变量的大小是4个字节 64位机器上:地址是64个二进制位,这个地址要存储的话要8个字节 所以在64位机器上,指针变量的大小是8个字节 */ printf("%d\n", sizeof(p)); printf("%d\n", sizeof(int*)); return 0; }
结构体
结构体是一种自定义的数据类型,它可以包含多个不同类型的成员,每个成员可以是基本数据类型、指针、数组、结构体等类型。
结构体通常用于将多个相关的数据项打包在一起,以便于传递和处理。结构体的定义由结构体名称和结构体成员组成。
例如:
struct person {
char name[20];
int age;
float height;
};
上述代码定义了一个名为 `person` 的结构体,它包含三个成员,分别是名字、年龄和身高。
我们可以使用结构体变量来存储和访问结构体中的成员。
例如:
struct person p1;
strcpy(p1.name, "John");
p1.age = 20;
p1.height = 1.8;
这个代码片段中,我们定义了一个 `person` 类型的结构体变量 `p1`,并向其中的成员赋值。我们使用 `strcpy` 函数将字符串 "John" 复制到 `p1` 的 `name` 成员中,然后将 `p1` 的 `age` 成员赋值为 20,将 `p1` 的 `height` 成员赋值为 1.8。
我们可以使用点操作符 `.` 来访问结构体中的成员。
例如:
printf("%s is %d years old and %.2f meters tall\n", p1.name, p1.age, p1.height);
这个代码片段中,我们使用 `printf` 函数输出 `p1` 的成员值。我们使用点操作符来分别访问 `p1` 的 `name`、`age` 和 `height` 成员,并将它们作为参数传递给 `printf` 函数。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> struct S { char name[20]; int age; float score; }; void print1(struct S t)// { printf("%s %d %lf", t.name, t.age, t.score); } void print2(struct S* ps) { printf("%s %d %lf", (*ps).name, (*ps).age, (*ps).score); printf("%s %d %lf", ps->name, ps->age, ps->score); } int main() { struct S s = { "张三",20,88.5f }; print1(s); print2(&s); return 0; }